最近在看zabbix server的啟動腳本。有如下變量指派:
exec=/usr/local/zabbix/sbin/zabbix_server
prog=${exec##*/}
這裡用到了shell進階變量的删除功能,這裡是想要通過exec這個變量得到/usr/local/zabbix/sbin/zabbix_server的程式名稱,即zabbix_server。
1)${變量#關鍵詞} 若變量内容從頭開始的資料符合關鍵詞,則将符合的最短資料删除
如 prog=${exec#*/};echo $prog 将顯示usr/local/zabbix/sbin/zabbix_server
這裡從頭開始最短比對任意字元到/的内容。
2)${變量##關鍵詞} 若變量内容從頭開始的資料符合關鍵詞,則将符合的最長資料删除
如 prog=${exec##*/};echo $prog 将顯示zabbix_server
這裡從頭開始最長比對任意字元到/的内容。
這裡如果不用shell進階變量的話,也可以用basename指令從/usr/local/zabbix/sbin/zabbix_server這個路徑得到程式名zabbix_server
prog=$(basename $exec);echo $prog 這裡同樣将顯示程序名zabbix_server
3)${變量%關鍵詞} 若變量内容從尾開始的資料符合關鍵詞,則将符合的最短資料删除
如要想得到/usr/local/zabbix/sbin/zabbix_server這個絕對路徑的絕對路徑目錄可以用
prog=${exec%zabbix_server};echo $prog 将顯示/usr/local/zabbix/sbin/ 這裡從變量的尾部開始最短比對zabbix_server這個關鍵字然後删除。
除了使用shell進階變量這裡為了得到絕對路徑目錄也可以使用dirname指令擷取
prog=$(dirname $exec);echo $prog 同樣将顯示/usr/local/zabbix/sbin
4)${變量%%關鍵詞} 若變量内容從尾開始的資料符合關鍵詞,則将符合的最長資料删除
如 prog=${exec%%/*};echo $prog 這裡将把exec這個變量清空
這裡從exec這個變量末尾開始最長比對/開頭的任意字元串。
5)${變量/舊字元串/新字元串} 若變量内容符合舊字元串,則第一個舊字元串被新字元串取代。
如将/usr/local/zabbix/sbin/zabbix_server這個路徑的第一個/變成#則可以用
prog=${exec//\//#};echo $prog 将顯示#usr/local/zabbix/sbin/zabbix_server 這裡由于需要将/替換成#,是以/需要用\/轉義一下
6)${變量//舊字元串/新字元串} 若變量内容符合舊字元串,則全部的舊字元串會被新字元串取代
如将/usr/local/zabbix/sbin/zabbix_server這個路徑的全部/變成#則可以用
prog=${exec//\//#};echo $prog 将顯示#usr#local#zabbix#sbin#zabbix_server