逻辑
正如我们在第 27 章中发现的, (()) 复合命令支持多种比较运算符。 还有一些可用于评估逻辑。 以下是完整列表:
表 34-6:比较运算符
操作员说明
操作员说明
<= 小于或等于
>= 大于或等于
<小于
>大于
== 等于
!= 不等于
&& 逻辑与
|| 逻辑或
表达式1?表达式2:表达式3 比较(三元)运算符。 如果表达式 表达式1
评估为非零(算术为真)然后 表达式2, 别的 表达式3.
用于逻辑运算时,表达式遵循算术逻辑规则; 也就是说,计算为零的表达式被认为是假的,而非零的表达式被认为是真。 这 (()) 复合命令将结果映射到 shell 的正常退出代码中:
[我@linuxbox ~]$ 如果((1)); 然后回显“真”; 否则回声“假”; 菲
true
[我@linuxbox ~]$ 如果((0)); 然后回显“真”; 否则回声“假”; 菲
false
[我@linuxbox ~]$ 如果((1)); 然后回显“真”; 否则回声“假”; 菲
true
[我@linuxbox ~]$ 如果((0)); 然后回显“真”; 否则回声“假”; 菲
false
最奇怪的逻辑运算符是 三元运算符. 该运算符(模仿 C 编程语言中的运算符)执行独立的逻辑测试。 它可以用作一种 if/then/else 语句。 它作用于三个算术表达式(字符串不起作用),如果第一个表达式为真(或非零),则执行第二个表达式。 否则,执行第三个表达式。 我们可以在命令行上试试这个:
[我@linuxbox ~]$ A = 0 [我@linuxbox ~]$ ((a<1?++a:--a)) [我@linuxbox ~]$ 回声$a
1
[我@linuxbox ~]$ ((a<1?++a:--a))
[我@linuxbox ~]$ 回声$a
0
[我@linuxbox ~]$ A = 0 [我@linuxbox ~]$ ((a<1?++a:--a)) [我@linuxbox ~]$ 回声$a
1
[我@linuxbox ~]$ ((a<1?++a:--a))
[我@linuxbox ~]$ 回声$a
0
在这里,我们看到了一个三元运算符的作用。 这个例子实现了一个切换。 每次执行操作时,变量的值 a 从零切换到一,反之亦然。
请注意,在表达式中执行赋值并不简单。
尝试时, 打坏 会声明一个错误:
[我@linuxbox ~]$ A = 0
[我@linuxbox ~]$ ((a<1?a+=1:a-=1))
bash: ((: a<1?a+=1:a-=1: 试图赋值给非变量(错误标记是“-=1”)
[我@linuxbox ~]$ A = 0
[我@linuxbox ~]$ ((a<1?a+=1:a-=1))
bash: ((: a<1?a+=1:a-=1: 试图赋值给非变量(错误标记是“-=1”)
这个问题可以通过用括号包围赋值表达式来缓解:
[我@linuxbox ~]$ ((a<1?(a+=1):(a-=1)))
[我@linuxbox ~]$ ((a<1?(a+=1):(a-=1)))
接下来,我们将看到一个更完整的示例,该示例在生成简单数字表的脚本中使用算术运算符:
#!/斌/庆典
# arith-loop: 演示算术运算符的脚本完成=0
A = 0
printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"
直到((完成)); 做 b=$((a**2))
c=$((a**3))
printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(finished=1)))
完成
#!/斌/庆典
# arith-loop: 演示算术运算符的脚本完成=0
A = 0
printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"
直到((完成)); 做 b=$((a**2))
c=$((a**3))
printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(finished=1)))
完成
在这个脚本中,我们实现了一个基于值的直到循环 完 多变的。 最初,变量设置为零(算术假),我们继续循环直到它变为非零。 在循环中,我们计算计数器变量的平方和立方
一种。 在循环结束时,计算计数器变量的值。 如果它小于 10(最大迭代次数),则加 XNUMX,否则变量finished 的值为XNUMX,使finished 在算术上为真,从而终止循环。 运行脚本给出了这个结果:
[我@linuxbox ~]$ 算术循环
[我@linuxbox ~]$ 算术循环
a
= 0
1
2
3
4
5
6
7
8
9
10
a
= 0
1
2
3
4
5
6
7
8
9
10
一个**2 一个**3
========
一个**2 一个**3
========
0
1
4
9
16
25
36
49
64
81
100
0
1
4
9
16
25
36
49
64
81
100
0
1
8
27
64
125
216
343
512
729
1000
0
1
8
27
64
125
216
343
512
729
1000