我正在提供一个带有以下内容的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
这是我需要做的
If
number2
is null 执行循环
Ifnumber2
is 404 执行循环
Ifnumber2
is 200 不执行循环
执行循环直到number1
为 12
当我尝试使用它的循环时,number2=200
它不会停止。似乎我很难让它停止 where number2
is 200
。
我如何编写语句,以便在number2=200
或有替代方案时停止 while 循环?
换句话说,只要 重复
(number2 is null OR number2 = 404) AND (number2 != 200) AND (number1 <= 12)
。请注意,您需要在此处进行某种分组,以明确 AND 和 OR 的优先级。(在 Bash 中,&&
从左到右||
操作,但通常 AND 运算符的绑定比 OR 运算符更强。)虽然你没有说对于 的其他值会发生什么
number2
,所以我们不妨放弃前两个条件,因为如果number2
是 null 或 404,那么它不可能是 200。所以我们得到(number2 != 200) AND (number1 <= 12)
.这里,
你有
|
and&
而不是||
and&&
。|
表示管道,&
在后台运行上述命令。所以上面会并行运行三个命令:一个管道有两个测试,另一个管道有一个测试,两者都在后台;并在前台进行一项测试。这没有多大意义。我在上面提到过&&
,||
这些是 Bash 中的逻辑条件运算符。简化的形式是:
(您可能还想使用比“number1”和“number2”更具描述性的变量名称。)
shell 中的逻辑运算符是
&&
和||
。&
和|
做了非常不同的事情(启动后台任务并分别在两个进程之间建立管道)。中的数字
$number2
看起来像 HTTP 状态代码。case
如上所述测试语句中的值将允许您在给定任意数量的状态代码的情况下选择正确的操作,而不会使 shell 代码成为笨拙的语句混乱if
。例如,任何客户端或服务器故障代码的操作都可以由模式触发4??|5??
。这也在逻辑上分离了两个变量的语义。该
number1
变量控制迭代次数,而number2
严格用于根据神秘命令的结果控制要采取的行动。