如何处理调用需要引用的参数的函数?
例如,考虑以下函数
time-stamp ()
{
if (( $# == 0)); then
tmstamp="$(date +T%T.%N)"
else
tmstamp="$(date $1)"
fi
echo "$tmstamp"
}
这里有一些调用的可能性
var="+%T %N"
stamp=$( date "${var}" )
或者
var="+%T %N"
stamp="$( date "${var}" )"
该构造
$(some_commands ...)
称为命令替换。您的两个示例之间的区别在于处理命令替换结果而不是命令的参数。(注意:您也可以将 shell 函数或别名放在命令的位置。)
外壳替换结果处理
Shell 对命令替换的结果执行单词/字段拆分和文件名扩展。如果您想阻止这些更改,请像在第二个示例中那样将结构括在双引号之间:
如果您不这样做,shell 将通过空格分隔符将结果拆分为单词/字段和/或对通配符(如
*
,?
, )执行文件名扩展[]
。除非您希望 shell 进行修改,否则您应该在那里使用双引号。例外与示范
分配是一个例外。POSIX shell(包括bash)不对变量赋值进行分词和文件名扩展:1
请注意,在第一个示例中,变量
x
确实包含完整的字符串a b
(包括四个空格),因此它没有在赋值中拆分。在这种情况下使用引号不会改变结果,但您可以使用它们来保持良好习惯。