变量内容的删除与取代
1)${变量#关键词}:从变量开头开始检索与关键词匹配的数据,将匹配的最短数据删除。
例:
[root@xiaoxiao abc]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@xiaoxiao abc]# echo ${PATH#*:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@xiaoxiao abc]# echo ${PATH#/*local/sbin:}
/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
关键词可以包括一般字符与通配符,例子中从PATH变量从左向右检索,能和关键词”*:“,“/*local/sbin:“匹配的最短数据是“/usr/local/sbin:“,“/usr/lib64/qt-3.3/bin:/usr/local/sbin:”,然后将匹配到的数据删除。
2)${变量##关键词}:从变量开头开始检索与关键词匹配的数据,将匹配的最长数据删除。
例:
[root@xiaoxiao abc]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@xiaoxiao abc]# echo ${PATH##/*:}
/root/bin
能和关键词”/*:“匹配的最长数据是”/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:“,然后就只剩下了”/root/bin“。
3)${变量%关键词}:从变量尾部开始检索与关键词匹配的数据,将匹配的最短数据删除。
例:
[root@xiaoxiao abc]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@xiaoxiao abc]# echo ${PATH%:/usr*bin}
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin
不解释了和上面一样,只是从右向左匹配
4)${变量%%关键词}:从变量尾部开始检索与关键词匹配的数据,将匹配的最长数据删除。
例:
[root@xiaoxiao abc]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@xiaoxiao abc]# echo ${PATH%%/bin:*bin}
/usr/lib64/qt-3.3
从右向左删除最长匹配数据。
变量的测试与替换
在写脚本时我们常常需要判断一个变量是否已经被赋值,若没有,则给予一个常量。下面来看一个例子:
[baby@xiaoxiao mytest]$ echo $abc
<--没有值输出
[baby@xiaoxiao mytest]$ name=baby
[baby@xiaoxiao mytest]$ username=${abc-$name}
[baby@xiaoxiao mytest]$ echo $username
baby <--name的值赋值给了username
上述例子中由于abc没有值,就把“-”号后面的name值赋值给了username,当然减号后面也可以直接跟字符串。如下:
[baby@xiaoxiao mytest]$ username=${abc-xiaoxiao}
[baby@xiaoxiao mytest]$ echo $username
xiaoxiao
上述中abc没有被赋值,若abc已经被设置成空值,则这个空值将会被赋值给username。如下:
[baby@xiaoxiao mytest]$ abc=""
[baby@xiaoxiao mytest]$ unset username
[baby@xiaoxiao mytest]$ username=${abc-xiaoxiao}
[baby@xiaoxiao mytest]$ echo $username
<--输出的是空字符串
[baby@xiaoxiao mytest]$
这时用“:-”即可,没有被赋值或者空字符串的变量都会被减号后面的变量替换。
[baby@xiaoxiao mytest]$ unset username
[baby@xiaoxiao mytest]$ abc=""
[baby@xiaoxiao mytest]$ username=${abc:-xiaoxiao}
[baby@xiaoxiao mytest]$ echo $username
xiaoxiao
这两个是经常使用的,下面是变量设定方式的一些整理:
变量设定方式 | str没有设定 | str为空字符串 | str已设定为非空字符串 |
var=${str-expr} | var=expr | var= | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${st:+expr} | var= | var= | var=expr |
var=${str=expr} | str=expr var=expr | str不变 var= | str不变 var=$str |
var=${str:=expr} | str=expr var=expr | str=expr var=expr | str不变 var=$str |
var=${str?expr} | expr输出至stderr | var= | var=$str |
var=${str:?expr} | expr输出至stderr | expr输出至stderr | var=$str |
以上所述参考鸟哥私房菜
原文地址:http://ljbaby.blog.51cto.com/10002758/1628012