根据我的bash手册页:If the word is double-quoted ${name[@]} expands each element of name to a separate word
。
这通常会导致预期的行为:
$ a=("foo 1" "bar 2")
$ for i in "${a[@]}"; do echo $i; done
foo 1
bar 2
$ size(){ echo $#;};size "${a[@]}"
2
$ [ "${a[@]}" = "foo 1 bar 2" ]&&echo ok
bash: [: too many arguments
但有时却没有:
$ [[ "${a[@]}" == "foo 1 bar 2" ]] && echo ok
ok
$ case "${a[@]}" in "foo 1 bar 2") echo ok; esac
ok
在这些情况下,它似乎被评估为单个字符串。 - 这很有道理,但有点令人惊讶。 - 我希望它等于"foo 1" "bar 2"
,因此会导致语法错误。
是否有规则在哪个上下文中评估哪种方式? (我在bash手册页中找不到正确的部分。)
其他问题:是否存在"${a[@]}"
处理与${a[@]}
不同的情况?
答案 0 :(得分:2)
[[
没有执行任何分词或全局扩展。
来自Bash FAQ:
Since word splitting is not performed when expanding shell variables in all
operands of the [[ command, this allows users to quote patterns as they wish
when assigning the variable, then expand the values to a single string that
may contain whitespace.
此外,请参阅Word Splitting:
[[ ... ]]
等Bash关键字中的扩展执行单词拆分。case
foo=$bar
bar=$(a command)
logfile=$logdir/foo-$(date +%Y%m%d)
答案 1 :(得分:-1)
该手册页确实说to a separate word
并没有说into one word
。数组"${a[@]}"
与"foo 1 bar 1"
不同。这只返回1个大字符串:
for i in "foo 1 bar 1"; do echo $i; done