Bash:从脚本与交互式shell

时间:2017-02-20 14:08:17

标签: bash shell zsh

我有以下代码:

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可执行文件吗?

1 个答案:

答案 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的名称。