shell 脚本中的 while 循环在 linux bash shell 中不起作用

While loop in shell script not working in the linux bash shell

我是在 linux 中编写 shell 脚本的新手。它是一个 csh 脚本,但是 运行 它在 bash shell 中,这就是为什么我使用 #!/bin/bash 而不是 #!/bin/csh.

  1 #!/bin/bash
  2 set i = 1
  3 echo it starts
  4 
  5 while ($i <= 5)
  6         echo i is $i
  7         @ i= $i +1
  8 end

**注意:**数字只是为了给行编号。

上面的代码给出了错误的输出:

it starts
./me.csh: line 9: syntax error: unexpected end of file

即使它回显 it starts 并且没有错误中指定的第 9 行,我也无法找出问题所在。

试试这个:

#!/bin/bash
echo it starts

i=1
while [ $i -le 5 ]; do
  echo i is $i
  i=$(( i+1 ))
done

示例输出:

it starts
i is 1
i is 2
i is 3
i is 4
i is 5

这里有一个很好的参考:

BASH Programming - Introduction HOW-TO

shebang 必须设置为应该解释脚本的 shell。您 运行 来自哪个 shell 脚本并不重要。唯一重要的是编写脚本的语言。

您的脚本是用 csh 编写的,因此必须有 shebang #!/bin/csh。即使您想从 bash 运行 它也是如此。此外,您在签名中遗漏了 space:

$ cat me.csh
#!/bin/csh
set i = 1
echo it starts

while ($i <= 5)
        echo i is $i
        @ i = $i + 1
end

输出:

$ ./me.csh
it starts
i is 1
i is 2
i is 3
i is 4
i is 5

您应该使用 Visual Studio 带有一些扩展的代码来检查 bash 脚本语法。我在 Window 10 WSL2 中使用 Vscode 到 运行 bash 脚本。

将 (...) 更改为 ((...)) 以修复错误语法:

#!/bin/bash
a=5

while ((a > 0)); do
    echo "a = $a"
    a=$((a - 1))
done