上一篇文章参见Bash Pitfalls: 编程易犯的错误(二)。
24. for arg in $*
和大多数 Shell 一样,Bash 支持依次读取单个命令行参数的语法。不过这并是$*或者$@,这两种写法都不正确,它们只能得到完整的参数列表,并非单独的一个个参数。
正确的语法是(没错要加上引号):
for arg in "$@" # 或者更简单的写法 for arg
在脚本中遍历所有参数是一个再普遍不过的需求,所以 for arg 默认等价于 for arg in "$@"。$@使用双引号后就有特殊的魔力,每个参数展开后成为一个独立的单词。("$@"等价于"$1" "$2" "$3" ...)
下面是一个错误的例子:
for x in $*; do echo "parameter: '$x'" done
执行的结果为:
$ ./myscript 'arg 1' arg2 arg3 parameter: 'arg' parameter: '1' parameter: 'arg2' parameter: 'arg3'
正确的写法:
for x in "$@"; do echo "parameter: '$x'" done
执行的结果为:
$ ./myscript 'arg 1' arg2 arg3 parameter: 'arg 1' parameter: 'arg2' parameter: 'arg3'