Bash Shell 中的 算术运算符、逻辑与或非(& | !)运算符、整数关系运算符、字符串关系运算符、文件或目录测试运算符


        此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:
 


 

在 Bash Shell 中,支持很多类型的运算符:

1 - 算数运算符 
2 - 整数关系运算符(只支持整数) 
3 - 逻辑运算符 
4 - 字符串关系运算符 
5 - 目录或文件测试文件运算符

 

1、算术运算符:

算术运算符 说明
+
-
* 乘(必须 * 转义,才能正常使用
/
% 取余

如何实现算术运算(+ - * /):

root@zhengzelin:~# a=1
root@zhengzelin:~# b=2
root@zhengzelin:~# c=$a+$b
root@zhengzelin:~# echo $c
1+2

根本没把 加号当加号,就像有的公司一样不把人当人!哈哈哈。

"在 shell 中,+ - * / 默认全都当成了字符;"
"由于 * 有特殊含义,在使用 “expr” 实现运算的时候,必须使用 \* 转义,但使用 let [] (()) 的时候不必转义!"

①、使用 let 实现算术运算:

root@zhengzelin:~# a=1
root@zhengzelin:~# b=2
root@zhengzelin:~# let c=a+b   或 let c=$a+$b
root@zhengzelin:~# echo $c
3

root@zhengzelin:~# let c=a*b
root@zhengzelin:~# echo $c
2

②、使用 expr 结合 ( ) 实现算术运算:

expr 他本身就是一个运算命令:
root@zhengzelin:~# expr 1 + 2
3

但是在脚本里可不能这样参加运算;得这样:
root@zhengzelin:~# a=1
root@zhengzelin:~# b=2

root@zhengzelin:~# c=$(expr $a + $b)
root@zhengzelin:~# echo $c
3

# 关于乘法:
root@zhengzelin:~# c=$(expr $a * $b)
expr: syntax error
root@zhengzelin:~# c=$(expr $a \* $b);echo $c
2

③、使用 [ ] 实现算术运算:

root@zhengzelin:~# a=1
root@zhengzelin:~# b=2
root@zhengzelin:~# c=$[a+b]  或 c=$[$a+$b]
root@zhengzelin:~# echo $c
3

④、使用 (( )) 实现算术运算:

root@zhengzelin:~# a=1
root@zhengzelin:~# b=2

root@zhengzelin:~# c=$((a+b))
root@zhengzelin:~# echo $c
3

 

2、关系运算符:

关系运算符只支持整数的比较,不支持字符串,除非字符串是变量并且值为整数!

[ ] 中使用的比较符 [[ ]] 中使用的比较符 (( )) 中使用的比较符 作用
-eq 或 == -eq 或 == == 等于
-ne 或 != -ne 或 != != 不等于
-gt 或 \> -gt 或 > > 大于
-lt 或 \< -lt 或 < < 小于
-ge -ge >= 大于等于
-le -le <= 小于等于

注意:关于 [ ] 、(( )) 、[[ ]] 等括号他们的区别下面会讲!

还有:在 [ ] 中 使用 > 和 < 得用转义字符!而 [[ ]] 、(( )) 中不需要!

①、[ ] 中 使用 > 的例子:

root@zhengzelin:~# vim test.sh 
a=1
b=2
if [ $a \> $b ];then     # 注意格式, [ ] 两边用空格隔开
    echo "a > b"
else
    echo "a < b"
    exit;
fi
root@zhengzelin:~# ./test.sh 
a < b

"# 因为 [ ] 是 bash 的内部命令;而 bash 也用 < 和 > 表示重定向"

②、[[ ]] 中 使用 > 的例子:

root@zhengzelin:~# vim test.sh 
a=1
b=2
if [[ $a > $b ]];then                                                                                                          
    echo "a > b"
else
    echo "a < b"
    exit;
fi
root@zhengzelin:~# ./test.sh 
a < b

③、(( )) 中使用 > 的例子:

root@zhengzelin:~# cat test.sh 
#!/bin/bash
a=2
b=3
if (( $a < $b ));then 
    echo "a < b"
else
    echo "a > b"
    exit;
fi
root@zhengzelin:~# ./test.sh 
a < b

 

3、逻辑运算符:

[ ]中逻辑运算符 [[ ]] 中逻辑运算符 (( )) 中逻辑运算符 作用
-a && & 或 && 两边的条件都成立,结果才为 true(与)
-o || | 或 || 一边条件成立则为 true(或)
条件为 true ,返回为 flase(非)

这边提到了 与或非 和 短路与、短路或,那么你知道 短路与 短路或 是什么意思吗???

①、 [ ] 中使用 -a :

root@zhengzelin:~# vim test.sh 
#!/bin/bash
a=2
b=3
if [ $a \< $b -a $a \> 0 ];then
    echo "a < b"
else
    echo "a > b"
    exit;
fi

root@zhengzelin:~# ./test.sh 
a < b

②、[[ ]] 中使用 &&:

root@zhengzelin:~# cat test.sh 
#!/bin/bash
a=2
b=3
if [[ $a < $b && $a < 5 ]];then 
    echo "a < b"
else
    echo "a > b"
    exit;
fi

root@zhengzelin:~# ./test.sh 
a < b

③、(( )) 中使用 &&:

root@zhengzelin:~# ./test.sh 
a < b
root@zhengzelin:~# cat test.sh 
#!/bin/bash
a=2
b=3
if (( $a < $b && $a < 5 ));then 
    echo "a < b"
else
    echo "a > b"
    exit;
fi

root@zhengzelin:~# ./test.sh 
a < b

 

4、字符串关系运算符:

[ ] 中使用的 [[ ]] 中使用的 (( )) 中使用的 作用
= 或 == = 或 == 两个字符串的比较是否相等
-z -z 判断是否为空字符串为空返回 true,反之返回flase
-n -n 判断是否为非空字符串不为空字符串则返回 true,反之则返回 flase

想必大家都知道 逻辑非(!) 吧,那么 当你使用 “! -z” 的时候,它的意思等于 “-n” 。下面会举例!

①、[ ]、[[ ]] 中使用 = 或 ==:

声明变量(不声明也行,直接使用字符串):
root@zhengzelin:~# test="abcde"
root@zhengzelin:~# zzl="abcde"
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
"[ ] 中:"
root@zhengzelin:~# if [ $test = $zzl ];then echo "他俩一样";else echo "no";fi 
他俩一样
root@zhengzelin:~# if [ $test == $zzl ];then echo "他俩一样";else echo "no";fi 
他俩一样
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
"[[ ]] 中:"
root@zhengzelin:~# if [[ $test = $zzl ]];then echo "他俩一样";else echo "no";fi 
他俩一样
root@zhengzelin:~# if [[ $test == $zzl ]];then echo "他俩一样";else echo "no";fi 
他俩一样

②、[ ]、 [[ ]] 中使用 -z 和 -n 和 !(逻辑非)

"注意: -z 和 -n 刚好代表的含义相反:"
-z : 判断字符串是否为空!(如果这个字符串为空,则返回 true 的值,如果不为空,则返回 flase 的值!)
-n : 判断字符串是否为非空!(如果这个字符串为非空,则返回 true 的值;如果为空,则返回 flase 的值!)

然后这里有意思的就是“逻辑非”(!) 如果你使用 "! -z" 那么他的意思就跟“-n”是一样的!()
例子如下:
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
"[ ] 中使用 -z 、-n 、!(逻辑非):"
root@zhengzelin:~# set | grep zzl
zzl=abc
root@zhengzelin:~# if [ -z $zzl ];then echo "这是一个空字符串";else echo "这不是一个空字符串"; fi
这不是一个空字符串
root@zhengzelin:~# if [ -n $zzl ];then echo "这是一个空字符串";else echo "这不是一个空字符串"; fi
这是一个空字符串 
root@zhengzelin:~# if [ ! -z $zzl ];then echo "这是一个空字符串";else echo "这不是一个空字符串"; fi
这是一个空字符串

# 证明: "! -z" = -n
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
"[[ ]] 中使用 -z、-n、 !(逻辑非):"~~  跟上方 [ ] 中是一样的!
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
(( )) 中使用:

root@zhengzelin:~# if (( -z $zzl ));then echo "这是一个空字符串";else echo "这不是一个空字符串"; fi
-bash: ((: -z abc : syntax error in expression (error token is "abc ")
这不是一个空字符串

我知道会报错,但是我不知道为啥,如果有大佬知道的话不嫌麻烦的话告诉一下小弟吧!

 

5、文件或目录测试运算符:

[ ] 和 [[ ]] 中 作用 输出内容 格式
-d 判断目录 是否存在(判断是否为目录) 存在为true,反之为 flase [ -d 目录 ]
-f 判断普通文件 是否存在(判断是否为普通文件) +1 +1
-b 判断 块设备文件 是否存在(判断是否为块设备文件) +1 +1
-c 判断 字符设备文件 是否存在(判断是否为 字符设备文件) +1 +1
-
-s 判断文件里有无内容(文件存在的情况下) +1 +1
-a 和 -e 判断所有(目录、文件、块设备和字符设备文件) +1 +1
-
-r 判断 文件是否具有 “读权限”(文件存在的情况下) +1 +1
-w 判断 文件是否具有 “写权限”(文件存在的情况下) +1 +1
-x 判断 文件是否具有 “执行权限”(文件存在的情况下) +1 +1

        你知道什么是 设备块吗? 什么是 字符设备吗?以及 Linux中如何查看该文件属于什么类型的文件吗?不知道的话还不赶紧点我 涨芝士?

举例:

①、[ ] [[ ]] 中使用 -d -f -b -c:

root@zhengzelin:~# if [  -d /dev/ ];then echo "存在";else echo "no";fi
存在
root@zhengzelin:~# if [  -b /dev/vda ];then echo "存在";else echo "no";fi
存在
root@zhengzelin:~# if [  -c /dev/autofs ];then echo "存在";else echo "no";fi
存在
root@zhengzelin:~# if [  -f /root/aaa ];then echo "存在";else echo "no";fi
存在
发布了99 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ljlfather/article/details/105106875