一个shell脚本:
VAR=(aa bb cc)
for i in "${VAR[@]}"
do
echo $i;
done
当使用. ar_test.sh
运行它时,它就工作了。
zhangyf@zhangyf-desktop:~/test$ . ar_test.sh
aa
bb
cc
但是以这种方式失败,
zhangyf@zhangyf-desktop:~/test$ ./ar_test.sh
./ar_test.sh: 9: Syntax error: "(" unexpected
文件中还有其他行,所以第9行实际上是VAR=(aa bb cc)。我知道区别在于后者派生了一个新的shell进程,而前者在当前shell中运行脚本,但为什么结果会有这么大的不同?
区别不是叉子,而是不同的外壳。.
源于当前shell中的文件,./ar_test.sh
使用默认shell(/bin/sh)运行可执行文件,该shell可能不支持数组。使用shebang作为脚本的第一行来指定正确的shell:
#!/bin/bash
...other code goes here...
您当前的shell可能是bash
。如果您的舍邦线路启动/bin/sh
,那么VAR=(aa bb cc)
将不起作用。使用source
(.
命令), the script will run in your current shell (that is,
bash`)。
确保脚本的第一行是:
#!/bin/bash
在新shell中启动脚本的另一种方法是bash ar_test.sh
。
针对评论中的激烈讨论:如果你想让你的脚本在bash可能没有安装在标准位置的系统上保持可移植性,你应该把#!/usr/bin/env bash
放在第一行。