如何使具有多个条件的 while 循环在真实条件下停止?

Bre*_*eph 6 bash

我正在提供一个带有以下内容的 while 循环

#!/bin/bash
number1=1
while [ -z "$number2" ] | [ "$number2" == 404 ] & [ "$number2" != 200 ] & [ "$number1" -lt 13 ]; do
  #number2=$(some command which can actually get a number)
  number2=200 # <<< e.g. a command that would return 
  let number1=number1+1
done
Run Code Online (Sandbox Code Playgroud)

这是我需要做的

If number2is null 做循环
If number2is 404 做循环
If number2is 200 不要做循环
做循环直到number1是 12

当我尝试循环时,number2=200它不会停止。似乎我在让它停止 where number2is 方面遇到了挑战200

我如何编写语句以便在number2=200或有替代方法时停止 while 循环?

ilk*_*chu 8

如果 number2 为 null 执行循环
如果 number2 是 404 执行循环
如果 number2 是 200 不要执行循环
执行循环直到 number1 为 12

换句话说,只要重复(number2 is null OR number2 = 404) AND (number2 != 200) AND (number1 <= 12)。请注意,您需要在此处进行某种分组,以明确 AND 和 OR 的优先级。(在bash,&&||运营从左至右,但往往与运营商结合比或运营商更强烈。)

虽然你没有说 的其他值会发生什么number2,所以我们不妨放弃前两个条件,因为如果number2是 null 或 404,那么它不可能是 200。所以我们得到(number2 != 200) AND (number1 <= 12).

这里,

while [ -z "$number2" ] | [ "$number2" == 404 ] & [ "$number2" != 200 ] & [ "$number1" -lt 13 ]; do ...
Run Code Online (Sandbox Code Playgroud)

你有|and&而不是||and &&|表示管道,并&在后台运行前面的命令。所以上面会并行运行三个命令:一个管道有两个测试,另一个有一个测试,都在后台;并在前台进行一项测试。那没有多大意义。我提到&&||上面,这些都是逻辑条件运营商在击。

简化的形式是:

while [ "$number2" != 200 ] && [ "$number1" -le 12 ]; do ...
Run Code Online (Sandbox Code Playgroud)

(您可能还想使用比“number1”和“number2”更具描述性的变量名称。)


Kus*_*nda 7

shell 中的逻辑运算符是&&and ||。在&|非常不同的东西(启动一个后台任务,并设置了两个进程之间的管道,分别)。


#!/bin/sh

number1=1

while [ "$number1" -le 12 ]; do

    number2=$( some command )

    case $number2 in
        200)
            break
            ;;
        ""|404)
            # nothing
            ;;
        *)
            printf 'Unexpected: number2 = %s\n' "$number2" >&2
            exit 1
    esac

    number1=$(( number1 + 1 ))

done
Run Code Online (Sandbox Code Playgroud)

中的数字$number2看起来像 HTTP 状态代码。测试上述case语句中的值将允许您在给定任意数量的状态代码的情况下选择正确的操作,而不会使 shell 代码成为一堆笨拙的if-statements。例如,任何客户端或服务器故障代码的操作都可以由模式触发4??|5??

这也在逻辑上分离了两个变量的语义。该number1变量控制迭代次数,而number2严格控制根据您的神秘命令的结果采取的行动。