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

我想在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 

我究竟做错了什么?

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

 $ 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衍生系统来说都是如此。

几件事情要尝试:

  • 用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的状态,所以你可以将它返回到它以前的状态。

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

 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

最后, 这里有一个很好的讨论扩张支架。