我有以下代码:
numbers=()
a=()
a+=('foo bar baz')
for ((x=0; x<=9; x++));
do
numbers+=($x)
done
echo $numbers
echo $a
当我通过复制/粘贴它在shell中以交互方式运行它时,我得到了我想要的输出,即:
➜ echo $numbers
0 1 2 3 4 5 6 7 8 9
➜ echo $a
foo bar baz
但是,当我将其作为脚本运行时,我得到:
0
foo bar baz
为什么呢?如何将其转换为交互式shell的行为?
完全披露:我用Google搜索广泛而无法找到它。我运行zsh并假设在这种情况下它与bash相同。我不太熟悉bash和交互式shell与文件差异。
修改
在有用的评论后,我现在找到了奇怪的罪魁祸首。
我认为这与chmod +x
有关。
我创建了一个更简单的脚本:
for ((x=0; x<=9; x+=1)) do numbers+=($x); done; echo $numbers;
echo $SHELL
这是输出(我在名为magic
的文件夹中):
chmod +x ./test
➜ magic ./test
0
/bin/zsh
➜ magic zsh ./test
0 1 2 3 4 5 6 7 8 9
/bin/zsh
可能是chmod +x
将其设置为bash可执行文件吗?
答案 0 :(得分:2)
您正在终端的zsh
中运行代码,其中echo $numbers
输出整个阵列的内容。在脚本中,它使用sh
(缺少shebang)运行,因此echo $numbers
等同于echo ${numbers[0]}
,仅输出第一个元素。 (您的sh
似乎是bash
的链接,因为数组语法仍然有效。)
但是,您的a
数组只有 一个元素,即字符串foo bar baz
,因为您引用了它。要添加多个元素,可以使用a+=(foo bar baz)
,以便将空格解释为分隔单独的数组元素,而不是文字空格。
$SHELL
的值是默认shell的名称,而不是当前正在运行的shell的名称。