在 shell 脚本中的 while 和 do 之间

Gee*_*eek 15 linux shell shell-script

我有以下脚本可以正常工作:

!/bin/bash

a=12
while [ $a -gt 10 ]
do
    echo "$a"
    a=$(($a-1))
done
echo "done"
Run Code Online (Sandbox Code Playgroud)

如果我在“do”上方添加“echo something”行,我希望在该行中看到语法错误。好像[ $a -gt 10 ]绕过了,就变成无限循环了。怎么会这样?

mur*_*uru 29

bash 手册

while

while命令的语法是:

测试命令;执行后续命令;
完毕
执行consequent-commands只要test-commands 具有零退出状态。返回状态是在 中执行的最后一个命令的退出状态,consequent-commands如果没有执行则为零。

注:test-commands复数。您可以在测试中使用多个命令,因此这是一个完全有效的循环,使用命令列表[ $a -gt 10 ]; echo "$a"作为测试:

while [ $a -gt 10 ]
echo "$a"
do
   a=$(($a-1))
done
Run Code Online (Sandbox Code Playgroud)

虽然命令[ $a -gt 10 ]可能会失败,也可能不会失败,但echo将(几乎)总是成功(除非它无法写入文本,或者发生了其他一些错误),因此测试命令的最终退出状态将始终为成功,并且循环将始终运行。


ImH*_*ere 10

来自man bash

而列表-1; 做列表-2;完成
该命令的同时连续执行列表中list-2
,只要最后一个命令列表list-1
返回零退出状态。

这意味着 alist可以包含多个命令,它确实这样做了(主要由分号或换行符分隔)。

所以,这非常有效:

#!/bin/bash

a=12

while 
    echo something
    echo "a before test =  $a"
    [ a -gt 10 ]
do
    echo "a after test =  $a"
    a=$(($a-1))
done
echo "done"
Run Code Online (Sandbox Code Playgroud)

如果dois echo之前的最后一个命令do 接收的退出代码始终为真 (0) 并且循环变为无限。