Shell 变量的值,可以通过简单的动作来进行删除、替换。
变量内容的删除
假如需要对 Shell 变量的内容进行部分删除,删除的动作可以从前往后删,也可以从后往前删。语法如下:
语法表达式 | 意义 |
---|---|
${variable#pattern} |
若变量内容从前向后匹配 pattern,则将匹配的最短的内容删除,类似正则表达式的非贪婪匹配 |
${variable##pattern} |
若变量内容从前向后匹配 pattern,则将匹配的最长的内容删除,类似正则表达式的贪婪匹配 |
${variable%pattern} |
若变量内容从后向前匹配 pattern,则将匹配的最短的内容删除,类似正则表达式的非贪婪匹配 |
${variable%%pattern} |
若变量内容从后向前匹配 pattern,则将匹配的最长的内容删除,类似正则表达式的贪婪匹配 |
在此,以命令 latex
的绝对路径 /usr/local/texlive/2015/bin/x86_64-linux/latex
来进行实验。
1 | $ path=$(which latex) |
变量内容替换
替换语法:
语法表达式 | 意义 |
---|---|
${variable/old/new} |
从前向后匹配,将遇到的第一个 old 替换成 new |
${variable//old/new} |
从前向后匹配,将所有陪陪的 old 替换为 new |
以 $PATH
举例,将 bin
替换为大写的 BIN
:
1 | $ path=${PATH} |
变量的测试与内容替换
某些时候,我们需要检测一下某个变量是否存在,若存在则使用其原有的值,否则给出一个值。虽然,在 Shell Script 中可以用 if...then...
结构来处理,但直接用 bash
提供的内置功能进行测试判断,
使得整个程序简洁得多。
1 | $ echo $var |
上面的例子中,关键在于减号(-)及其后面的内容,语法格式为 new=${old-default}
,其意义为:若变量 old
存在且不为空,则将其内容赋值给变量 new
;
否则,将给定的 default
赋值给 new
。Shell 变量设定语法,还可以将前面语法格式中的 -
改为 :-, +, :+, =, :=, ?, :?
,一共 8 种格式,各自的意义为:
语法表达式 | old 不存在 |
old 为空字符串 |
old 存在且不为空 |
---|---|---|---|
new=${old-content} |
new=content |
new= |
new=$old |
new=${old:-content} |
new=content |
new=content |
new=$old |
new=${old+content} |
new= |
new=content |
new=content |
new=${old:+content} |
new= |
new= |
new=content |
new=${old=content} |
old=content , new=content |
old 不变,new= |
old 不变,new=$old |
new=${old:=content} |
old=content , new=content |
old=content , new=content |
old 不变,new=$old |
new=${old?content} |
content 输出至 stderr |
old= |
new=$old |
new=${old:?content} |
content 输出至 stderr |
content 输出至 stderr |
new=$old |
Reference:
鸟哥的 Linux 私房菜