macos:在命令行和bash文件中截断数组的输出不同



同一组命令在直接在命令窗口上运行和在文件中写入时会给出不同的输出:

xxx-MacBook-Air ~ % bash b
a b c
b c b c
xxx-MacBook-Air ~ % all=(a b c); echo ${all[@]}; out=a; all=${all[*]/$out}; echo ${all[@]}
a b c
b c

我从命令窗口复制并粘贴相同的命令到文件由于某种原因,文件在运行时除了截断数组的内容外,还会克隆它…任何建议吗?

不同之处在于您使用bash运行脚本,但您的交互shell是zsh,它们对数组的处理方式不同。具体来说,当您像访问一个普通变量一样访问一个数组时,bash将其视为访问数组的第一个元素,而zsh将其视为访问整个数组。更具体地说,bash将all=${all[*]/$out}视为替换all的第一个元素,而zsh将其视为替换整个数组(将其转换为普通变量,并有效地删除第二个和第三个元素)。

使用declare -p all可以更清楚地看到这一点,因为它显示变量是普通字符串还是数组,如果它是数组,它清楚地显示元素内的空格(与echo相比,这使它们看起来就像元素之间的空格)。下面是一个简单的演示,首先在bash中:

$ all=(a b c); all=plainstring; declare -p all
declare -a all='([0]="plainstring" [1]="b" [2]="c")'

可以看到,all=plainstring只替换了all[0],并将其设置为"plainstring"。与zsh:

比较
% all=(a b c); all=plainstring; declare -p all
typeset all=plainstring

这里它用一个普通字符串替换了整个数组。

顺便说一句,另一个常见的区别是$array${array}——zsh将其扩展到数组的所有元素,但bash只将其扩展到第一个元素。如果您想在bash中获取整个数组的内容,您需要使用"${array[@]}"(使用双引号防止它对单个元素做一些愚蠢的事情)。

最新更新