此链接通往 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
存在