从技术上讲,参数包括传递给程序的参数(位置参数)、特殊的 shell 变量(例如 $# 和 $?)以及普通变量(也称为关键字参数)。位置参数不能直接赋值,但可以使用 set 命令重新赋值。
参数替换
参数值替换最简单形式就是使用 $
,比如 $i
或者 $9
。
${parameter}
mv $file ${file}x
${parameter:-value}
如果 parameter
为空则使用 value
echo ${nosuch:-hello}
。
echo Using editor ${EDITOR:-/bin/vi}
。
${parameter:=value}
和上面的一样,但是在 parameter
为空时,会使用 value
给它赋值。
不能给位置参数使用这种方式赋值,即 parameter
不能是数字。
上面的命令不能单独使用,因为 shell 在替换后,会立马执行命令,会报错。
1 | PHONEBOOK= |
${parameter:?value}
如果 parameter
不为空,则 shell 使用 parameter
的值替换,如果为空,那么 shell 会把 value
写到标准错误然后退出,如果是 login shell,并不会真的退出。
如果 value 为空,那么 shell 使用默认值输出到标准错误 prog: parameter: parameter null or not set
。
1 | PHONEBOOK= |
使用此构造器,可以轻松检查程序所需的变量是否已全部设置且不为空,通过返回值判断:
1 | : ${TOOLS:?} ${EXPTOOLS:?} ${TOOLBIN:?} |
${parameter:+value}
和 ${parameter:-value}
效果相反。
以上命令中的 value 可以是命令。WORKDIR=${DBDIR:-$(pwd)}
Pattern Matching Constructs
略