为什么在我的Linux Bash中使用这种简单的循环不起作用



我正在尝试在unix脚本(bash)中进行简单的循环。

这是我的脚本:

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
echo "n"

观察以下bash shell的warey.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衍生的系统都是如此。

将我的评论移至正式答案:

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中添加支架扩展。

最后,这是对支架扩展的极好讨论。

可以尝试的几件事:

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

您可以使用-o test

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

您可以使用它来测试 braceexpand 的状态,因此您可以将其返回其以前的状态。

我也有类似的问题,我从

更改了shebang
#!/bin/sh

to

#!/bin/bash

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

chmod +x nameofyourscript.sh

然后像这样运行

./nameofyourscript.sh

相关内容

  • 没有找到相关文章

最新更新