While-loop-in-bash:循环是否知道循环中每个指令的退出代码?

While-loop-in-bash:循环是否知道循环中每个指令的退出代码?,bash,Bash,我试图弄清楚while循环逻辑在bash中是如何工作的 如果我有4个指示;在循环中,它们将按照循环中设置的条件执行n次 while something do command1 if ! command2 then break fi command3 done 虽然;循环是否知道每个命令的返回码 理想情况下,您可以编写一个带有while循环的shell脚本,在其中检查每个命令的退出代码,并在任何命令返回错误时再次执行。 这个逻辑在bash中是否可能,或者循

我试图弄清楚while循环逻辑在bash中是如何工作的

如果我有4个指示;在循环中,它们将按照循环中设置的条件执行n次

while something
do
    command1
    if ! command2
    then break
    fi
    command3
done
虽然;循环是否知道每个命令的返回码

理想情况下,您可以编写一个带有while循环的shell脚本,在其中检查每个命令的退出代码,并在任何命令返回错误时再次执行。 这个逻辑在bash中是否可能,或者循环不知道每个命令的返回代码,并且将do done之间的块视为一个

编辑:

例如:

a=2
b="test"

while [ "$?" != 0 ]
do
   ls $b
   cd $b
   grep "2.txt" | mv 2.txt $a.txt
   ls $b
done
这个简化的示例基本上是检查dir,cd,找到一个具有特定名称的文件并重命名它

当我运行这个循环时,如果这些命令中的任何一个返回代码不是0,那么循环应该从头开始,直到所有命令返回0,然后循环退出


这是真的还是整个命令块作为单个实体处理,因此如果最后一个命令返回0,它将退出?

命令只检查紧跟其后的条件语句的退出状态。它不会检查循环中语句的状态

while something
do
    command1
    if ! command2
    then break
    fi
    command3
done
您可以在循环内使用
if
语句中断循环

while something
do
    command1
    if ! command2
    then break
    fi
    command3
done

只要
某项操作成功,此操作就会循环,但如果
命令2
失败,则停止。

命令仅检查紧跟其后的条件语句的退出状态。它不会检查循环中语句的状态

while something
do
    command1
    if ! command2
    then break
    fi
    command3
done
您可以在循环内使用
if
语句中断循环

while something
do
    command1
    if ! command2
    then break
    fi
    command3
done

只要
某项操作成功,此操作就会循环,但如果
命令2
失败,则停止。

命令仅检查紧跟其后的条件语句的退出状态。它不会检查循环中语句的状态

while something
do
    command1
    if ! command2
    then break
    fi
    command3
done
您可以在循环内使用
if
语句中断循环

while something
do
    command1
    if ! command2
    then break
    fi
    command3
done

只要
某项操作成功,此操作就会循环,但如果
命令2
失败,则停止。

命令仅检查紧跟其后的条件语句的退出状态。它不会检查循环中语句的状态

while something
do
    command1
    if ! command2
    then break
    fi
    command3
done
您可以在循环内使用
if
语句中断循环

while something
do
    command1
    if ! command2
    then break
    fi
    command3
done

只要
某个东西成功,它就会循环,但如果
命令2
失败,它就会停止。

也许:使用一个无限循环,并将所有命令与
&
连接在一起,最后使用
中断

while true
do
   ls $b &&
   cd $b &&
   grep "2.txt" | mv 2.txt $a.txt &&
   ls $b &&
   break
done

注意
而。。。;做已完成
而。。。;做循环

也许:使用一个无限循环,将所有命令与
&
连接在一起,并在末尾使用
中断

while true
do
   ls $b &&
   cd $b &&
   grep "2.txt" | mv 2.txt $a.txt &&
   ls $b &&
   break
done

注意
而。。。;做已完成
而。。。;做循环

也许:使用一个无限循环,将所有命令与
&
连接在一起,并在末尾使用
中断

while true
do
   ls $b &&
   cd $b &&
   grep "2.txt" | mv 2.txt $a.txt &&
   ls $b &&
   break
done

注意
而。。。;做已完成
而。。。;做循环

也许:使用一个无限循环,将所有命令与
&
连接在一起,并在末尾使用
中断

while true
do
   ls $b &&
   cd $b &&
   grep "2.txt" | mv 2.txt $a.txt &&
   ls $b &&
   break
done


注意
而。。。;做已完成
而。。。;做loop

你能展示你不确定的部分的示例代码和注释吗?嗨,我添加了一个示例来从概念上展示我不确定的部分。感谢您的测试将使用
$?
的最新值,该值由while循环之前的最后一条语句为第一次迭代设置,由主体的最后一条语句为后续迭代设置。实际上,否;这就是为什么我感到困惑;我希望循环读取每个命令的每个返回代码,但这不是真的。您可以显示示例代码并对您不确定的部分进行注释吗?您好,我添加了一个示例来从概念上显示我不确定的内容。感谢您的测试将使用
$?
的最新值,该值由while循环之前的最后一条语句为第一次迭代设置,由主体的最后一条语句为后续迭代设置。实际上,否;这就是为什么我感到困惑;我希望循环读取每个命令的每个返回代码,但这不是真的。您可以显示示例代码并对您不确定的部分进行注释吗?您好,我添加了一个示例来从概念上显示我不确定的内容。感谢您的测试将使用
$?
的最新值,该值由while循环之前的最后一条语句为第一次迭代设置,由主体的最后一条语句为后续迭代设置。实际上,否;这就是为什么我感到困惑;我希望循环读取每个命令的每个返回代码,但这不是真的。您可以显示示例代码并对您不确定的部分进行注释吗?您好,我添加了一个示例来从概念上显示我不确定的内容。感谢您的测试将使用
$?
的最新值,该值由while循环之前的最后一条语句为第一次迭代设置,由主体的最后一条语句为后续迭代设置。实际上,否;这就是为什么我感到困惑;我期望循环读取每个命令的每个返回代码,这不是真的,正如我所想的那样;它不知道循环中的每个命令。因此,如果我有N个命令,我将在每个命令上放置一个if,以检查返回代码是否不是0?您可以在每个命令(最后一个命令除外)后写入
&&
,并在最后一个命令后检查结果。或者最好在每个命令后编写
| | break
;它不知道循环中的每个命令。因此,如果我有N个命令,我会在每个命令上加一个if来检查返回码是否不是0?您可以写