背景
在程式設計過程中遇到一個問題。在一個bash
指令碼中,我需要用lame
重新生成音訊檔案的壓縮版本。原有的引數為三個:種子值
、源txt檔案
和目標wav檔案
。我希望的是能夠順便自動生成壓縮的mp3版本以及新增了背景音樂的版本,但是我又不希望新增新的輸入引數。這樣,對於原本的系統引數進行切割和連線就成為必要的操作。
問題
如何切割bash從系統中獲得的引數,並把引數和新的檔案字尾連線在一起?
方案
第一,一般來說,bash指令碼中,$0
表示指令碼自身的名稱,$1
表示第一個引數,$2
表示第二個引數,$3
之後的以此類推。
第二,bash指令碼用$
符號獲取變數的值。換言之,不管是系統變數,還是指令碼自身透過=
所命名的變數,都可以透過$
進行獲取。
第三,bash指令碼對變數獲取提供了索引的語法格式:${var:start:end}
。其中var
是你的變數名。start
是起始位置,值應為正值,表示從左到右,從0開始計。
end
是結束位置,可正可負。為負值,值的大小相當於從變數尾部刪除的字元數目。
如果為起始位置/結束位置空,表示到首/尾處,不進行擷取。
第四,bash指令碼對於變數的連線,只需要在字串內把變數和字串內容連線在一起即可(如果會出現變數和字母連線的情形,用${var}
的語法格式宣告變數名的邊界即可)。
所以對於某個變數i,要其最後三個字元為指定值,一個通用的正規化為:
"${i::-3}<new-value>"
評價
好處是可以不用在多在bash中執行命令,或者在指令碼中增加新的引數。
不足還有待觀察。