1

根据我的 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[@]}

4

2 回答 2

2

不执行分词或全局扩展[[

来自Bash 常见问题解答

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.

此外,请参阅分

  • 不会对 Bash 关键字内的扩展执行分词,例如[[ ... ]]case
  • 不会对分配中的扩展执行分词。因此,不需要在这样的命令中引用任何内容:
    • foo=$bar
    • bar=$(a command)
    • logfile=$logdir/foo-$(date +%Y%m%d)
    • PATH=/usr/local/bin:$PATH ./myscript
于 2013-06-07T12:16:25.193 回答
-1

手册页确实说to a separate word了,也没有说into one word。a 数组"${a[@]}""foo 1 bar 1". 这仅返回 1 个大字符串:

for i in "foo 1 bar 1"; do echo $i; done
于 2013-06-07T11:04:55.930 回答