最近在看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