Shell Variables Operations

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
2
3
4
5
6
7
8
9
10
11
$ path=$(which latex)
$ echo ${path}
/usr/local/texlive/2015/bin/x86_64-linux/latex
$ echo ${path#/*/} # 从前向后,最短匹配,only 最前面的`/`
usr/local/texlive/2015/bin/x86_64-linux/latex
$ echo ${path##/*/} # 从前向后,最长匹配,只剩下最后面的 `latex`
latex
$ echo ${path%/*} # 从后向前,最短匹配
/usr/local/texlive/2015/bin/x86_64-linux
$ echo ${path%%/local*} # 从后向前,最长匹配
/usr

变量内容替换

替换语法:

语法表达式 意义
${variable/old/new} 从前向后匹配,将遇到的第一个 old 替换成 new
${variable//old/new} 从前向后匹配,将所有陪陪的 old 替换为 new

$PATH 举例,将 bin 替换为大写的 BIN

1
2
3
4
5
6
7
$ path=${PATH}
$ echo ${path}
/opt/mpich-install/bin:/usr/local/texlive/2015/bin/x86_64-linux:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ echo ${path/bin/BIN} # 只替换了第一个
/opt/mpich-install/BIN/:/usr/local/texlive/2015/bin/x86_64-linux:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ echo ${path//bin/BIN} # 全部替换
/opt/mpich-install/BIN:/usr/local/texlive/2015/BIN//x86_64-linux:/usr/local/sBIN:/usr/local/BIN:/usr/sBIN:/usr/BIN:/sBIN:/BIN:/usr/games:/usr/local/games

变量的测试与内容替换

某些时候,我们需要检测一下某个变量是否存在,若存在则使用其原有的值,否则给出一个值。虽然,在 Shell Script 中可以用 if...then... 结构来处理,但直接用 bash 提供的内置功能进行测试判断,
使得整个程序简洁得多。

1
2
3
4
5
6
7
8
9
$ echo $var
# <<=== 空行,表示变量 `var` 不存在或者为空字符
$ var=${var-Linux}
$ echo ${var}
Linux
$ var="Ubuntu Server"
$ var=${var-Linux}
$ echo ${var}
Ubuntu Server

上面的例子中,关键在于减号(-)及其后面的内容,语法格式为 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 私房菜