1. Shell中变量的原形:${var}
一般来说,$var
和{var}
效果一样,都可以扩展一个变量(即获得它的值)。但如果要显示变量值加一些字符时,就会出错,因为默认时他会把$
后的一整个单词作为扩展对象。
这时应该用变量的原形:${var}
,即是加一个大括号来指明变量名称的范围
[root]# aa='ajax'
[root]# echo $aa
ajax
[root]# echo $aa_AA
[root]# echo ${aa}_AA
ajax_AA
2. $(cmd)
展开的结果是cmd执行后的标准输出,相当于用反引号括起来的命令。
[root@bogon t]# ls
1.txt 2.txt
[root@bogon t]# echo $(ls)
1.txt 2.txt
这里要注意的是$(cmd)中的命令的错误输出是不会被替换的,替换的只是标准输出
[root@bogon t]# var=$(cat 3.txt)
cat: 3.txt: 没有那个文件或目录
[root@bogon t]# echo $var
$var
显然是空的
3. 几种特殊的替换结构:
${var:-string},${var:+string},${var:=string},${var:?string}
(1) ${var:-string} 和 ${var:=string}
若变量var
为空或者未定义,则用在命令行中用string
来替换${var:-string}
否则变量var
不为空时,则用变量var
的值来替换${var:-string}
[root@bogon ~]# echo $a
[root@bogon ~]# echo ${a:-bcc}
bcc
[root@bogon ~]# echo $a
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:-bcc}
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo $a
[root@bogon ~]# echo ${a:=bbc}
bbc
[root@bogon ~]# echo $a
bbc
${var:-string}
和${var:=string}
比较 后者发现$var
为空时,把string
赋值给了var
后者是一种赋值默认值的常见做法
(2) ${var:+string}
规则和上面的完全相反
即只有当var
不是空的时候才替换成string
,若var
为空时则不替换或者说是替换成变量var
的值,即空值
[root@bogon ~]# a=ajax
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# echo ${a:+bbc}
bbc
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo $a
[root@bogon ~]# echo ${a:+bbc}
[root@bogon ~]#
(3) ${var:?string}
替换规则:若变量var
不为空,则用变量var
的值来替换${var:?string}
若变量var
为空,则把string
输出到标准错误中,并从脚本中退出。
可利用此特性来检查是否设置了变量的值
[root@bogon ~]# echo $a
[root@bogon ~]# echo ${a:?bbc}
-bash: a: bbc
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:?bbc}
ajax
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:-`date`}
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo ${a:-`date`}
2017年 02月 21日 星期二 10:13:46 CST
[root@bogon ~]# echo ${a:-$(date)}
2017年 02月 21日 星期二 10:13:59 CST
[root@bogon ~]# b=bbc
[root@bogon ~]# echo ${a:-$b}
bbc
4. $((exp)) POSIX标准的扩展计算
这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp))
,包括三目运算符
注意:这种扩展计算是整数型的计算,不支持浮点型和字符串等
若是逻辑判断,表达式exp
为真则为1
,假则为0
[root@bogon ~]# echo $(3+2)
-bash: 3+2: 未找到命令
[root@bogon ~]# echo $((3+2))
5
[root@bogon ~]# echo $((3.5+2))
-bash: 3.5+2: 语法错误: 无效的算术运算符 (错误符号是 ".5+2")
[root@bogon ~]# echo $((3>2))
1
[root@bogon ~]# echo $((3>2?'a':'b'))
-bash: 3>2?'a':'b': 语法错误: 期待操作数 (错误符号是 "'a':'b'")
[root@bogon ~]# echo $((3>2?a:b))
0
[root@bogon ~]# echo $((a=3+2))
5
[root@bogon ~]# echo $((a++))
5
[root@bogon ~]# echo $a
6
5. 四种模式匹配替换结构:
${var%pattern}
${var%%pattern}
${var#pattern}
${var##pattern}
${var%pattern},${var%%pattern}
从右边开始匹配
${var#pattern},${var##pattern}
从左边开始匹配
${var%pattern} ,${var#pattern}
表示最短匹配,匹配到就停止,非贪婪
${var%%pattern},${var##pattern}
是最长匹配
只有在pattern
中使用了通配符才能有最长最短的匹配,否则没有最 长最短匹配之分
结构中的pattern
支持的通配符:
*
表示零个或多个任意字符?
表示零个或一个任意字符[...]
表示匹配中括号里面的字符[!...]
表示不匹配中括号里面的字符
[root@bogon ~]# f=a.tar.gz
[root@bogon ~]# echo ${f##*.}
gz
[root@bogon ~]# echo ${f%%.*}
a
[root@bogon ~]# var=abcdccbbdaa
[root@bogon ~]# echo ${var%%d*}
abc
[root@bogon ~]# echo ${var%d*}
abcdccbb
[root@bogon ~]# echo ${var#*d}
ccbbdaa
[root@bogon ~]# echo ${var##*d}
aa
#发现输出的内容是var去掉pattern的那部分字符串的值
记忆的方法为:
#
是 去掉左边(键盘上#
在 $
的左边)
%
是去掉右边(键盘上%
在$
的右边)
单一符号是最小匹配;两个符号是最大匹配
6. 其他
${file:0:5}
:提取${file}
最左边的 5 个字节${file:5:5}
:提取第 5 个字节及之后的连续5个字节${file:5}
:提取第5个字节及之后的子串
也可以对变量值里的字符串作替换:
-
${file/dir/path}
:将第一个dir 替换为path -
${file//dir/path}
:将全部dir 替换为 path -
${#var}
可计算出变量值${var}
的长度