在使用脚本时,要把参数替换为它的值,最简单的形式就是在参数前面加上一个美元符号,例如$i
或$9
。
1. ${parameter}
:
如果因为参数名后面的字符可能会导致冲突,可以把参数名放在大括号中,比如:
mv $file ${file}x
该命令将$file指定的文件改名,在原文件名后加一个x。该命令不能写成如下:
mv $file $filex
因为shell会把filex的值作为第2个参数。
要访问大于或等于10的位置参数,必须把数字放在大括号中,如:${11}
。
2. ${parameter:-value}
该结构意思是,如果parameter不为空就使用它的值,否则就替换为value。例如:
echo Using editor ${EDITOR:-/bin/vi}
如果EDITOR不为空,shell就用它的值来替换,否则就替换为值/bin/vi。它与如下脚本的作用相同:
if [ -n "$EDITOR" ]
then
echo Using editor $EDITOR
else
echo Using editor /bin/vi
fi
在终端上测试此结构如下:
[root@localhost-test ~]#EDITOR=/bin/ed
[root@localhost-test ~]#echo ${EDITOR:-/bin/vi}
/bin/ed
[root@localhost-test ~]#EDITOR=
[root@localhost-test ~]#echo ${EDITOR:-/bin/vi}
/bin/vi
[root@localhost-test ~]#
3 ${parameter:=value}
这与前面一个结构差不多,区别在于:当parameter为空时,不但使用value,还把它赋值给parameter。但是不能用这种方式给位置参数赋值(也就是parameter不能是数字)。
这种结构的典型用法是测试到处变量是否设置了值,如果没有就将它设置为默认值,就像:
${$PHONEBOOK:=$HOME/phonebook}
它的意思是如果PHONEBOOK已经设置了某个值,则保留该值,否则就将它设置为$HOME/phonebook。
注意前面的例子不能作为单独的命令,因为shell在完成替换后就试图执行替换的结果:
[root@localhost-test ~]#PHONEBOOK=
[root@localhost-test ~]#${PHONEBOOK:=$HOME/phonebook}
-bash: /root/phonebook: No such file or directory
[root@localhost-test ~]#
如果要把这种结构作为独立的命令使用,经常借助于空命令。如果写了
: ${PHONEBOOK:=$HOME/phonebook}
shell仍然做替换,然而什么也不执行。
[root@localhost-test ~]#PHONEBOOK=
[root@localhost-test ~]#: ${PHONEBOOK:=/HOME/phonebook}
[root@localhost-test ~]#
4 ${parameter:?value}
如果parameter不为空,shell就替换它的值,否则shell就把value写入标准错误,然后退出(这种情况发生在登陆shell中,不会从系统注销)。
如果略去value,shell就写入信息:
prog:parameter null or not set
以下是终端上的示例:
[root@localhost-test ~]#PHONEBOOK=
[root@localhost-test ~]#: ${PHONEBOOK:?"NO PHONEBOOK file"}
-bash: PHONEBOOK: NO PHONEBOOK file
[root@localhost-test ~]#: ${PHONEBOOK:?}
-bash: PHONEBOOK: parameter null or not set
[root@localhost-test ~]#
使用这种结构可以很容易检查某程序需要的一组变量是否都设置了并且不为空,就如:
: ${TOOLS:?} ${EXPTOOLS:?} ${TOOLBIN:?}
5 ${parameter:+value}
如果parameter不为空,则这种结构就替换为value,否则什么也不替换。
[root@localhost-test ~]#PHONEBOOK=1
[root@localhost-test ~]#echo option : ${PHONEBOOK:+"phonebook"}
option : phonebook
[root@localhost-test ~]#PHONEBOOK=
[root@localhost-test ~]#echo option: ${PHONEBOOK:+"phonebook is empty"}
option:
[root@localhost-test ~]#echo :$PHONEBOOK:
::
[root@localhost-test ~]#