为什么这个简单的FOR LOOP在我的Linux bash中不起作用?

时间:2014-01-26 22:21:32

标签: linux bash shell unix

我正在尝试在UNIX脚本(bash)中执行一个简单的for循环。

这是我的剧本:

for i in {1..3}
do
   echo "Welcome $i times"
done

我期待输出......

Welcome 1 times
Welcome 2 times
Welcome 3 times

......但我明白了......

Welcome {1..3} times

我做错了什么?

4 个答案:

答案 0 :(得分:12)

你没有提到你是如何执行你的脚本的,这可能会有所作为。假设我们有一个脚本:

$ cat welcome.sh
for i in {1..3}
do
   echo "Welcome $i times"
done

从bash shell中观察以下三次welcome.sh调用:

$ ps -p $$
  PID TTY          TIME CMD
11509 pts/25   00:00:00 bash
$ source welcome.sh
Welcome 1 times
Welcome 2 times
Welcome 3 times
$ bash welcome.sh
Welcome 1 times
Welcome 2 times
Welcome 3 times
$ sh welcome.sh
Welcome {1..3} times

最后一个失败,因为在我的系统上,sh默认为dash,而不是bash。例如,对于任何现代的Debian / Ubuntu派生系统都是如此。

答案 1 :(得分:2)

要尝试的几件事:

  • 以bash作为前缀运行脚本。 bash myscript.sh而不仅仅是myscript.sh。这将保证您在BASH下运行。
  • 运行set -o并查看 braceexpansion 是否设置为 on 。如果没有,请运行set -o braceexpand并查看是否可以解决您的问题。

您可以使用-o 测试测试 braceexpand 是打开还是关闭。

if [[ -o braceexpand ]]
then
    echo "Brace expand is on"
else
    echo "It is off"
fi

您可以使用它来测试 braceexpand 的状态,这样您就可以将其恢复到之前的状态。

答案 2 :(得分:1)

将我的评论转到正式答案:

set -o braceexpand

这使得{x..y}样式(以及其他类型)扩展。如果您想永久保留,请将其添加到.bashrc。如果您想暂时使用它,可以“包含”您的代码:

set -o braceexpand  # enable brace expansion
echo {1..3}         # or whatever your command is
set +o braceexpand  # disable it

坦率地说,我认为开/关方法的代码开销不值得,而且我总是在我的.bashrc添加大括号扩展。

最后,here's an excellent discussion of brace expansion ins and outs.

答案 3 :(得分:-2)

您的脚本没有遇到任何类型的错误。我遇到了同样的问题,简单的解决方案是您没有授予它执行的权限,因此您可以这样做:

chmod +x nameofyourscript.sh

然后像这样运行它

./nameofyourscript.sh