1,算数运算符
# 整数运算
expr
$(())
$[]
let
[root@m01~]# let a++
[root@m01~]# echo $a
2
[root@m01~]# a=1
[root@m01~]# b=2
[root@m01~]# expr $a + $b
3
[root@m01~]# expr $(( a + b ))
3
[root@m01~]# expr $[ a + b ]
3
[root@m01~]# expr $[ $a + $b ]
3
注意:
乘法*有特殊意义,使用需要加上\
[root@m01~]# expr 2 * 6
expr: 语法错误
[root@m01~]# expr 2 \* 6
12
[root@m01~]# expr $(( a * b ))
6
#浮点运算
bc
[root@m01~]# yum install -y bc
# scale=3,保留3位小数点,当分子小于分母,值的0会省略
[root@m01~]# echo "scale=3;4/30" | bc
.133
[root@m01~]# echo "scale=3;4/2" | bc
2.000
------------------应用场景---------------
[root@m01~]# free
total used free shared buff/cache available
Mem: 995896 116276 785456 25016 94164 735600
Swap: 1048572 1544 1047028
#取值
[root@m01~]# free | awk 'NR==2{print $NF}'
735184
[root@m01~]# free | awk 'NR==2{print $2}'
995896
#赋值
[root@m01~]# total=`free | awk 'NR==2{print $2}'`
[root@m01~]# availble=`free | awk 'NR==2{print $NF}'`
#计算
[root@m01~]# echo "scale=2;$available / $total" | bc
.74
2,测试运算符
test 等同于 [ ] ###注意 [ ] 里面字符旁加空格
# 测试目录是否存在
[root@m01~]# test -d /etc/; echo $?
0
#测试文件长度是否大于0
[root@m01~]# [ -s a.jz ];echo $?
0
#测试文件是否有执行权限 (可换成w或r权限测试)
[root@m01~]# [ -x a.jz ];echo $?
1
#测试文件是否是软连接
[root@m01~]# [ -L a.jz ];echo $?
1
[root@m01~]# man test
查看更多测试参数
# 查看字符串数量是否大于0
[root@m01~]# a=""
[root@m01~]# b="xy"
[root@m01~]# [ -n "$a" ];echo $?
1
[root@m01~]# [ -n "$b" ];echo $?
0
## 查看字符串数量是否为0 如上
# 查看字符串值是否相等
[root@m01~]# [ "asd" = "ssss" ];echo $?
1
[root@m01~]# [ "asd" = "asd" ];echo $?
0
## != 查看字符串是否不想等;如上
# 并且关系
[root@m01~]# read -p "输入用户名:" name
输入用户名:zx
[root@m01~]# read -p "输入密码:" pwd
输入密码:123
[root@m01~]# [ "$name" = "zx" ] && [ "$pwd" = "123" ];echo $?
0
[root@m01~]# [ "$name" = "zx" -a "$pwd" = "111" ];echo $?
1
# 或者关系
[root@m01~]# [ "$name" = "zx" -o "$pwd" = "111" ];echo $?
0
[root@m01~]# [ "$name" = "zx" ] || [ "$pwd" = "123" ];echo $?
0
###字符串一定加上双引号!!!!!
[root@m01~]# [ "12" -eq "23" ];echo $?
1
[root@m01~]# [ "12" -lt "23" ];echo $?
0
[root@m01~]# [ "12" -ge "23" ];echo $?
1
[root@m01~]# [ "12" -ne "23" ];echo $?
0
# -eq 等于
# -gt 大于
# -ge 大于等于
# -lt 小于
# -le 小于等于
# ne 不等于
# 并且关系
[root@m01~]# [ "12" -gt "2" -a "6" -eq "6" ];echo $?
0
[root@m01~]# [ "12" -gt "2" ] && [ "6" -eq "6" ];echo $?
0
# 或者关系
[root@m01~]# [ "12" -gt "2" ] || [ "6" -eq "7" ];echo $?
0
[root@m01~]# [ "12" -gt "2" -o "6" -eq "6" ];echo $?
0
3,关系运算符(c语言风格)
[root@m01~]# (( 10==4 ));echo $?
1
[root@m01~]# (( 10>=4 ));echo $?
0
[root@m01~]# (( 10>4 && 4==4 ));echo $?
0
不可以使用-a 或者-o
4,赋值运算符(c语言风格)
[root@m01~]# a=2
[root@m01~]# ((a-=3))
[root@m01~]# echo $a
-1
#备注: 固定格式为((a加减乘除=需要操作的数字))
[root@m01~]# ((a-=10))
[root@m01~]# echo $a
2
[root@m01~]# ((a*=10))
[root@m01~]# echo $a
20
# %取余数
[root@m01~]# x=10
[root@m01~]# ((x%=3))
[root@m01~]# echo $x
1
5,补充[[ ]]
1, 一般用法
[root@m01~]# [[ "abc" = "scc" ]];echo $?
1
2, 正则表达式用法
[root@m01~]# echo $USER
root
[root@m01~]# [[ "$USER" =~ ^ro ]];echo $?
0
#正则表达式一定不要加引号
------- 使用场景---------
例1:
[root@m01~]# vim /script/zx.sh
#!/bin/bash
#参数只能是一个,不然会提示"只能输入一个参数"
[ $# -ne 1 ] && echo "只能输入一个参数" && exit
#第一个参数必须是数字,不然会提示"只能输入数字"
[[ ! $1 =~ ^[0-9]+(\.[0-9])?$ ]] && echo "只能输入数字" && exit
#符合以上条件,提示"okkkkk"
echo "okkkkk"
[root@m01~]# chmod +x /script/zx.sh
[root@m01~]# /script/zx.sh 2223 eeee
只能输入一个参数
[root@m01~]# /script/zx.sh eeee
只能输入数字
[root@m01~]# /script/zx.sh 333
okkkkk
[root@m01~]# /script/zx.sh 44.2
okkkkk
例2:
[root@m01~]# vim /script/zz.sh
#!/bin/bash
[ $# -ne 2 ] && echo "必须输入两个参数" && exit
[[ ! $1 =~ ^[0-9]+$ ]] && echo "第一个参数必须是整数" && exit
[[ ! $2 =~ ^[0-9]+$ ]] && echo "第二个参数也要是整数" && exit
[ $1 -eq $2 ] && echo "值相等"
[ $1 -gt $2 ] && echo "第一个值大"
[ $1 -lt $2 ] && echo "第二个值大"
[root@m01~]# chmod +x /script/zz.sh
[root@m01~]# /script/zz.sh 11
必须输入两个参数
[root@m01~]# /script/zz.sh ee 33
第一个参数必须是数字
[root@m01~]# /script/zz.sh 11 rrr
第二个参数也要是数字
[root@m01~]# vim /script/zz.sh
[root@m01~]# /script/zz.sh 11 33
第二个值大
[root@m01~]# /script/zz.sh 11 1
第一个值大
1,&& 优先级大于 || , 先执行两边的&& 再执行||
root@m01~]# ((8>6)) && ((9<10)) || ((1>0)) && ((4==3))
[root@m01~]# echo $?
1
[root@m01~]# ((8>6)) && ((9<10)) || ((1>0)) && ((4>3))
[root@m01~]# echo $?
0
2,[^0-9] 与 [!1-9] 都是取反的意思
[root@m01~/ab]# ls
1.txt 4.txt 7.txt aa.txt a.txt
[root@m01~/ab]# ls [^0-9].txt
a.txt
[root@m01~/ab]# ls [!0-9].txt
a.txt
3, &放在脚本最后,&前面的内容加上( ),代表放在后台执行,执行效率快
[root@m01~]# vim /script/11.sh
#!/bin/bash
(ping -c1 10.0.0.7 &> /dev/null
[ $? -eq 0 ] && echo "10.0.0.7 is ok" || echo "10.0.0.7 is down" ) &
(ping -c1 10.0.0.8 &> /dev/null
[ $? -eq 0 ] && echo "10.0.0.8 is ok" || echo "10.0.0.8 is down" )
[root@m01~]# chmod +x /script/11.sh
[root@m01~]# /script/11.sh
10.0.0.8 is ok
10.0.0.7 is ok
4.
control +z 把任务放在后台执行
jobs查看后台任务
fg +%n后台任务调到前台执行
[root@m01~]# ping 10.0.0.7
PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.
64 bytes from 10.0.0.7: icmp_seq=1 ttl=64 time=0.439 ms
64 bytes from 10.0.0.7: icmp_seq=2 ttl=64 time=0.642 ms
64 bytes from 10.0.0.7: icmp_seq=3 ttl=64 time=0.573 ms
^Z
[1]+ 已停止 ping 10.0.0.7
[root@m01~]# jobs
[1]+ 已停止 ping 10.0.0.7
[root@m01~]# fg %1
ping 10.0.0.7
64 bytes from 10.0.0.7: icmp_seq=3 ttl=64 time=0.299 ms
64 bytes from 10.0.0.7: icmp_seq=4 ttl=64 time=0.681 ms
... ...
网友评论