我想在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 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
。
最后, 这里有一个很好的讨论扩张支架。