如何用在bash中擷取部分系統引數?

Laziko發表於2024-06-07

背景

在程式設計過程中遇到一個問題。在一個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中執行命令,或者在指令碼中增加新的引數。

不足還有待觀察。

相關文章