【博学谷学习记录】超强总结,用心分享|Shell运算符
文章目录
- expr命令
- 算术运算符
- 整数比较运算符
- 字符串比较运算符
- `[[]]` 和 `[]` 的区别
- 区别1: word splitting的发生
- 区别说明
- word splitting介绍
- 区别2: 转义字符
- 区别说明
- 示例
- 小结
expr命令
Shell expr 是一个功能强大,并且比较复杂 的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等
本文只涉及整数的计算
直接输出结果: expr 算术运算符表达式
给变量赋值: result=算术运算符表达式``
注意表达式两边的反引号,不是单引号
# 计算后会直接输出结果
[root@node1 ~] expr 1 + 2
3# 注意: 运算符表达式中每个数字与符号之间要有空格
[root@node1 ~] expr 1+2
1+2# 如果要赋值给变量要加 ` 反引号
[root@node1 ~] result=`expr 1 + 2`
[root@node1 ~] echo $result
3
[root@node1 ~]
算术运算符
下表列出了常用的算术运算符,假定变量 a 为 1,变量 b 为 2:
四则运算中如果使用了(), 也需要转义\( 1 + 1 \)
| 运算符 | 说明 | 举例 |
|---|---|---|
| + | 加法 | expr $a + $b结果为 3 |
| - | 减法 | expr $a - $b结果为 -1 |
| * | 乘法 | expr $a \\* $b结果为 2 |
| / | 除法 | expr $b / $a结果为 2 |
| % | 取余 | expr $b % $a结果为 0 |
| = | 赋值 | a=$b 将把变量 b 的值赋给 a |
整数比较运算符
下表列出了常用的比较运算符,假定变量 a 为 1,变量 b 为 2:
注意: 整数比较运算符只支持整数,不支持小数与字符串,除非字符串的值是整数数字。
每个命令都有返回值, 返回0代表成功, 返回1代表失败
| 运算符 | 说明 | 举例 |
|---|---|---|
-eq | equals 检测两个数是否相等,相等返回 0, 否则返回1。 | [ $a -eq $b ]返回 1。 |
-ne | not equals检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ]返回 0。 |
-gt | greater than检测左边的数是否大于右边的, 是返回0, 否则1 | [ $a -gt $b ]返回 1。 |
-lt | lower than检测左边的数是否小于右边的, 是返回0, 否则1 | [ $a -lt $b ]返回 0。 |
-ge | greater equals检测左边的数是否大于等于右边的, 是返回0, 否则1 | [ $a -ge $b ]返回 1。 |
-le | lower equals检测左边的数是否小于等于右边的, 是返回0, 否则1 | [ $a -le $b ]返回 0。 |
< | 检测左边的数是否小于右边的, 是返回0, 否则1 | (($a<$b))返回0 |
<= | 检测左边的数是否小于等于右边的, 是返回0, 否则1 | (($a<=$b))返回0 |
> | 检测左边的数是否大于右边的, 是返回0, 否则1 | (($a>$b))返回1 |
>= | 检测左边的数是否大于等于右边的, 是返回0, 否则1 | (($a>=$b))返回1 |
== | 检测左边的数是否等于右边的, 是返回0, 否则1 | (($a==$b))返回1 |
!= | 检测左边的数是否不等于右边的, 是返回0, 否则1 | (($a!=$b))返回0 |
字符串比较运算符
可以比较2个变量, 变量的类型可以为数字(整数,小数)与字符串
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
字符串比较可以使用[[]]和[]2种方式
字符串比较没有<=可以通过[[ "a" < "b" || "a" = "b" ]]
| 运算符 | 说明 | 举例 |
|---|---|---|
| == 或 = | 相等。用于比较两个字符串或数字,相同则返回 0。可以使用= | [ $a == $b ]返回1 [ $a = $b ]返回 1 [[ $a == $b ]]返回1 [[ $a = $b ]]返回1 |
| != | 不相等。用于比较两个字符串或数字,不相同则返回 0。 | [ $a != $b ]返回 0 [[ $a != $b ]]返回 0 |
| < | 小于, 用于比较两个字符串或数字, 小于返回0, 否则返回1 | [ $a \\< $b ]返回 0 [[ $a < $b ]]返回 0 |
| > | 大于, 用于比较两个字符串或数字, 大于返回0, 否则返回1 | [ $a \\> $b ]返回 1 [[ $a > $b ]]返回 1 |
| -z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 1。 |
| -n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n "$a" ]返回 0。 |
| $ | 检测字符串是否不为空,不为空返回 0 ,否则返回1。 | [ $a ] 返回 0。 |
[root@node1 ~] a=5
[root@node1 ~] b=7
[root@node1 ~] # [[和]]与表达式之间一定要有空格,不然会语法报错
# 错误示范[[$a < $b || $a = $b]]
if [[ "a" < "b" || "a" = "b" ]]
> then
> echo "$a <= $b : a 小于等于 b"
> else
> echo "$a > $b: a 大于 b"
> fi5 <= 7 : a 小于等于 b
[root@node1 ~]
[[]] 和 [] 的区别
区别1: word splitting的发生
区别说明
[[]] 不会有word splitting发生[] 会有word splitting发生
word splitting介绍
会将含有空格字符串进行分拆分割后比较
通过$?获取上一个命令的退出状态, 0代表成功, 1代表失败
[root@node1 ~] a=a
[root@node1 ~] b="a b c"# 比较
[root@node1 ~] [[ $a == $b ]]
[root@node1 ~] echo $?
1 #单中括号拆分了变量b的a后面的2个字母当成了参数
[root@node1 ~] [ $a == $b ]
-bash: [: 参数太多
[root@node1 ~]
区别2: 转义字符
区别说明
[] 需要对 <,>等 转义 , 格式为 [ 字符串1 \< 字符串2 ][[]] 对 < 不需要转义, 格式为 [[ 字符串1 < 字符串2 ]]
示例
[] 执行效果,需要转义比较才能返回正确的结果
# 不转义比较字符串,怎么比较返回都是0,说明无效
[root@node1 ~] [ "a" > "b" ]
[root@node1 ~] echo $?
0
[root@node1 ~] [ "a" < "b" ]
[root@node1 ~] echo $?
0# 转义比较字符串小于的比较为0表示正确
[root@node1 ~] [ "a" \> "b" ]
[root@node1 ~] echo $?
1
[root@node1 ~] [ "a" \< "b" ]
[root@node1 ~] echo $?
0
[[]] 执行效果, 不需要转义执行结果正确
[root@node1 ~] [[ $a < $b ]]
[root@node1 ~] echo $?
0
[root@node1 ~] [[ $a > $b ]]
[root@node1 ~] echo $?
1
小结
- 整数比较运算符
比较方式:
[]和(())
方式1:
[ 整数1 options 整数2 ]
options: -eq -gt -ge -lt -le -ne
方式2:((整数1 options 整数2))
options: < <= > >=
- 字符串,数字比较运算符
介绍: 可以比较2个变量, 变量的类型可以为字符串, 数字(整数,小数)
比较方式:[]和[[]]
方式1:
[ 变量1 options 整数2 ]
options: <,>,==,=,!=
<,>需要转义
比较含有空格的字符串, 需要使用""号括起来, 否则会分割拆分
方式2:[[ 变量1 options 变量2]]
options: <,>,==,=,!=
<,>不需要转义
推荐使用哪个比较运算符?
[[ 表达式 ]] 即可以实现数字和字符串比较, 并且不需要转义, 不会分割
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
