访问bash命令行参数$ @ vs $ *
在许多SO问题和bash教程中,我看到可以通过两种方式访问bash脚本中的命令行参数:
$ ~ >cat testargs.sh #!/bin/bash echo "you passed me" $* echo "you passed me" $@
其结果是:
$ ~> bash testargs.sh arg1 arg2 you passed me arg1 arg2 you passed me arg1 arg2
$*
和$@
什么区别?
何时应使用前者,何时使用后者?
引用特殊参数时会出现差异。 让我来说明一下不同之处:
$ set -- "arg 1" "arg 2" "arg 3" $ for word in $*; do echo "$word"; done arg 1 arg 2 arg 3 $ for word in $@; do echo "$word"; done arg 1 arg 2 arg 3 $ for word in "$*"; do echo "$word"; done arg 1 arg 2 arg 3 $ for word in "$@"; do echo "$word"; done arg 1 arg 2 arg 3
引用重要性的另一个例子是:注意“arg”和数字之间有2个空格,但是如果我不引用$ word:
$ for word in "$@"; do echo $word; done arg 1 arg 2 arg 3
在bash中, "$@"
是迭代的“默认”列表:
$ for word; do echo "$word"; done arg 1 arg 2 arg 3
Bash Hackers Wiki的一个很好的方便的概述表:
如果参数要存储在一个脚本variables和参数预期包含空格,我衷心推荐使用"$*"
技巧与内部字段分隔符$IFS
设置为选项卡 。
$ *
从一个开始扩展到位置参数。 当扩展出现在双引号内时,扩展为单个字,每个参数的值由IFS特殊variables的第一个字符分隔。 也就是说,“$ *”相当于“$ 1c $ 2c …”,其中c是IFSvariables值的第一个字符。 如果IFS未设置,则参数由空格分隔。 如果IFS为空,则参数在不插入分隔符的情况下进行连接。
$ @
从一个开始扩展到位置参数。 当扩展出现在双引号内时,每个参数将扩展为一个单独的单词。 也就是说,“$ @”相当于“$ 1”“$ 2”…如果双引号扩展出现在一个单词内,则第一个参数的扩展与原始单词的开头部分相连,最后一个参数的最后一部分与原始单词连接。 当没有位置参数时,“$ @”和$ @展开为空(即,它们被移除)。
来源: Bash男人
$ @和$ *是一样的,但是每个参数都是一个带引号的string,也就是说,参数是完整的传递的,没有解释或者扩展。 这意味着,除其他外,参数列表中的每个参数都被视为一个单独的单词。
当然,应该引用“$ @”。