我正在尝试在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 / Ubuntu派生系统都是如此。
有几件事要尝试:
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
中添加大括号扩展。
最后,here's an excellent discussion of brace expansion ins and outs.