扩展bash数组的规则
根据我的bash手册:扩展bash数组的规则,bash,Bash,根据我的bash手册:如果单词是双引号的${name[@]}将name的每个元素扩展为一个单独的单词 这通常会导致准确的预期行为: $ 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 argumen
如果单词是双引号的${name[@]}将name的每个元素扩展为一个单独的单词
这通常会导致准确的预期行为:
$ 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[@]}
的处理方式不同?手册页确实对一个单独的单词说了,而没有对一个单词说。数组a“${a[@]}”
与“foo 1 bar 1”
不同。这只返回1个大字符串:
for i in "foo 1 bar 1"; do echo $i; done
手册页确实对一个单独的单词说了,而没有对一个单词说。数组a“${a[@]}”
与“foo 1 bar 1”
不同。这只返回1个大字符串:
for i in "foo 1 bar 1"; do echo $i; done
没有对[[
执行分词或全局扩展
发件人:
此外,请参阅:
- 在Bash关键字(如
[…]]
和大小写
)内的扩展上不执行分词
- 在赋值中不对扩展执行分词。因此,不需要在命令中引用以下内容:
foo=$bar
bar=$(一个命令)
logfile=$logdir/foo-$(日期+%Y%m%d)
PATH=/usr/local/bin:$PATH./myscript
对
[[
不执行分词或全局扩展
发件人:
此外,请参阅:
- 在Bash关键字(如
[…]]
和大小写
)内的扩展上不执行分词
- 在赋值中不对扩展执行分词。因此,不需要在命令中引用以下内容:
foo=$bar
bar=$(一个命令)
logfile=$logdir/foo-$(日期+%Y%m%d)
PATH=/usr/local/bin:$PATH./myscript
删除“
并使用${a[@]}
而不是“${a[@]}”
案例${a[@]}在“foo 1 bar 2”中回显ok;esac
->okUse设置-xv
查看bash如何处理命令。删除“
”
并使用${a[@]}
而不是${a[@>在案例{foo 1 bar中)echo ok;esac
->ok使用set-xv
查看bash如何处理命令。确切地说,在第一个示例中,它被计算为单独的单词。在第二个示例中,它被计算为单独的单词。-这是令人惊讶的,也是问题的原因。确切地说,在第一个示例中,它被计算为单独的单词。在第二个例子,它被评价成一个单词。-这是令人惊讶的,也是问题的原因。