算数运算符
运算符命令
Shell if参数
shell 编程中使⽤到得if语句内判断参数:
–b 当file存在并且是块⽂件时返回true
-c 当file存在并且是字符⽂件时返回true
-d 当pathname存在并且是⼀个⽬录时返回true
-e 当pathname指定的⽂件或⽬录存在时返回true
-f 当file存在并且是⽂件时返回true
-g 当由pathname指定的⽂件或⽬录存在并且设置了SGID位时返回为true
-h 当file存在并且是符号链接⽂件时返回true,该选项在⼀些⽼系统上⽆效
-k 当由pathname指定的⽂件或⽬录存在并且设置了“粘滞”位时返回true
-p 当file存在并且是命令管道时返回为true
-r 当由pathname指定的⽂件或⽬录存在并且可读时返回为true
-s 当file存在⽂件⼤⼩⼤于0时返回true
-u 当由pathname指定的⽂件或⽬录存在并且设置了SUID位时返回true
-w 当由pathname指定的⽂件或⽬录存在并且可执⾏时返回true。⼀个⽬录为了它的内容被访问必然是可执⾏的。
-o 当由pathname指定的⽂件或⽬录存在并且被⼦当前进程的有效⽤户ID所指定的⽤户拥有时返回true。
UNIX Shell ⾥⾯⽐较字符写法:
-eq 等于
-ne 不等于
-gt ⼤于
-lt ⼩于
-le ⼩于等于
-ge ⼤于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n ⾮空串
⽤于数值计算的命令
双括号(()) 效率极⾼,常⽤⽅法
案例:(注意必须是整数,双括号不⽀持浮点数,浮点数需要其他命令计算)
# 加减乘除
root@icloudy:~/shell_program# echo $((3+4))
7
root@icloudy:~/shell_program# echo $((5-3))
2
root@icloudy:~/shell_program# echo $((5*3))
15
root@icloudy:~/shell_program# echo $((5/3)) # 取商,除法
1
root@icloudy:~/shell_program# echo $((5**2))
25
root@icloudy:~/shell_program# echo $((7%4)) # 取余数,取模计算
3
# 变量计算
root@icloudy:~/shell_program# ((i=5))
root@icloudy:~/shell_program# ((i=i*i))
root@icloudy:~/shell_program# echo $i
25
# 复杂数学运算
root@icloudy:~/shell_program# ((a=2+2**3-4%3))
root@icloudy:~/shell_program# echo $a
9
# 变量定义在括号外,写法2
root@icloudy:~/shell_program# b=$((2+2**3-4%3))
root@icloudy:~/shell_program# echo $b
9
# 不⽤变量赋值,直接看结果,⼀定记得⽤$符号
root@icloudy:~/shell_program# echo $((2+2**3-4%3))
9
#结果判断,真假值,1为真,0位假
root@icloudy:~/shell_program# echo $((3<4))
1
root@icloudy:~/shell_program# echo $((3>4))
0
root@icloudy:~/shell_program# echo $((3==4))
0
特殊运算符
++ 加⼀– 减⼀ 注意这⾥有坑
++a 是先计算加⼀,然后赋值a a++ 是先对变量a操作,再加⼀ 注意这个先后顺序
root@icloudy:~/shell_program# a=5
root@icloudy:~/shell_program# echo $((++a)) # 这是先对a变量,加⼀,然后再赋值
6
root@icloudy:~/shell_program# echo $a
6
# 先打印,再赋值
root@icloudy:~/shell_program# echo $((a++))
6
root@icloudy:~/shell_program# echo $a
7
案例:对⽤户输⼊判断是否是整数的脚本
利⽤read命令,获取⽤户输⼊
# [-n string] or [string] “string”的⻓度为⾮零non-zero则为真
# -p 后⾯跟提示信息,即在输⼊前打印提示信息。
# 状态码不为0 就是表示有错误
root@icloudy:~/shell_program# vim is_int.sh
root@icloudy:~/shell_program# cat is_int.sh
#!/bin/bash
print_usage(){
printf "Please enter an integer\n"
exit 1
}
# 接受⽤户输⼊
read -p "Please input first number: " firstnum
# 如果⽤户输⼊,去掉了整数部分,为空,说明是⼀个纯数字
# if的-n参数,如果 string ⻓度⾮零,则为真
# 如果该字符串不为空,那么if逻辑成⽴,说明⽤户输⼊的不是⼀个纯数字
# 逻辑判断,限制⽤户必须输⼊⼀个纯数字
if [ -n "`echo $firstnum|sed 's/[0-9]//g'`" ];then
print_usage
fi
read -p "Please input the operators: " operators
# 判断运算符
if [ "${operators}" != "+" ] && [ "${operators}" != "-" ] && [ "${operators}" != "*" ] && [ "${operators}" != "/" ];then
echo "Please use {+|-|*|/}"
exit 2
fi
# 输⼊第⼆个数字
read -p "Please input second number: " secondnum
if [ -n "`echo $secondnum|sed 's/[0-9]//g'`" ];then
print_usage
fi
# 最后数值计算
echo "${firstnum}${operators}${secondnum}结果是:$((${firstnum}${operators}${secondnum}))"
执⾏脚本
root@icloudy:~/shell_program# bash is_int.sh
Please input first number: 1
Please input the operators: +
Please input second number: 5
1+5结果是:6
⼀个简单的玩法,直接对⽤户输⼊计算
root@icloudy:~/shell_program# cat jisuan.sh
#!/bin/bash
echo $(($1))
root@icloudy:~/shell_program# bash jisuan.sh 3+4
7
root@icloudy:~/shell_program# bash jisuan.sh "3*4"
12
let命令
let命令等同于双括号计算, “((赋值表达式))”
但是双括号效率更⾼
root@icloudy:~/shell_program# # 计算变量相加
root@icloudy:~/shell_program# i=2
root@icloudy:~/shell_program# i=i+8
root@icloudy:~/shell_program# echo $i
i+8
root@icloudy:~/shell_program# unset i
root@icloudy:~/shell_program# i=2
root@icloudy:~/shell_program# let i=i+8
root@icloudy:~/shell_program# echo $i
10
# 上述等同于
root@icloudy:~/shell_program# i=2
root@icloudy:~/shell_program# echo $((i=i+8))
10
实际脚本开发,检测nginx服务状态
root@icloudy:~/shell_program# cat check_nginx_status.sh
#!/bin/bash
# 定义功能函数
CheckUrl(){
timeout=5
fails=0
success=0
while true
do
wget --timeout=$timeout --tries=1 http://pythonav.cn/ -q -O /dev/null
# 如果上述状态码不等于0,表示出错
if [ $? -ne 0 ]
then
let fails=fails+1 # 失败错误次数+1
else
let success+=1
fi
if [ $success -ge 1 ]
then
echo "It's success."
exit 0
fi
# 如果出错次数⼤于2,报警
if [ $fails -ge 2 ];then
echo "该⽹站⼀定是挂了,超哥快去检查下你的服务器!"
exit 2
fi
done
}
CheckUrl
expr命令
expr命令允许在命令⾏处理数学表达式,简单的计算器命令
查看帮助
expr --help
# 注意参数之间必须有空格
root@icloudy:~/shell_program# expr 1 + 5
6
# expr并不是很好⽤,⽐较麻烦
# 很多符号在shell⾥有特殊含义因此必须得转义使⽤
root@icloudy:~/shell_program# expr 5 * 2
expr: syntax error
root@icloudy:~/shell_program# expr 5 \* 2
10
# 求⻓度
root@icloudy:~/shell_program# expr length 123132134524asdqweqweqewqfgdfgdfgdf
35
# 逻辑判断,必须加上引号
root@icloudy:~/shell_program# expr 33 '>' 3
1
root@icloudy:~/shell_program# expr 33 '>' 333
0
# 除法
root@icloudy:~/shell_program# expr 50 / 5
10