shell脚本–进阶
条件测试:
$?返回码
判断命令或者脚本是否执行成功(最近的一条)
0 true 为真就是成功 成立
非0 false 失败或者异常
test 命令可以进行条件测试,然后根据返回值来判断条件是否成立。
常用操作符
-e 测试文件或者目录是否存在 exist (只有-e可以既可以测试文件和目录)
-d 测试目录是否存在
-f 测试文件是否存在
-r 测试当前用户是否对文件或目录有读权限
-w 测试当前用户是否对文件或目录有写权限
-x 测试当前用户是否对文件或目录有执行权限
整数比较符(以下操作符只能用于整数比较)
-eq 等于 ==(既可以比较整数,也可以比较字符串)
-ne 不等于 !=
-gt 大于 >
-lt 小于 <
-ge 大于等于 >=
-le 小于等于 <=
比较符的第二种
[ a = b ]
第三种格式:
[[ ]] 可以使用更高级的模式,可以使用正则表达式,使用字符串的时候可以不加引号。
第四种:
(( ))
逻辑与和逻辑或(多条件判断)
与:&& 条件都要满足才成立 -a
单中括号
[root@test2 opt]# a=5
[root@test2 opt]# [ $a -ne 1 -a $a -ne 2 ]
[root@test2 opt]# echo $?
0
双中括号
[root@test2 opt]# [[ $a -ne 1 && $a -ne 2 ]]
[root@test2 opt]# echo $?
0
或:|| 有一个条件满足就成立 -o
[root@test2 opt]# [[ $a -ne 1 || $a -ne 2 ]]
[root@test2 opt]# echo $?
0
if语句
单分支结构
if [ 3 -gt 2 ]
then
echo "ok"
fi
#if 后面是条件测试语句
#then 命令序列,只有条件测试语句成立,才会执行then的命令模块
#fi 结束语句。
双分支结构
if [ 3 -gt 5 ]
then
echo "OK"
else
echo "No"
fi
#条件满足执行then,不满足执行else,执行完毕,语句结束
#通过位置变量传参的方式,给脚本内部传一个ip地址
#如果ping不通,提示用户ip is offline.
#ping的通的要提示用户ip is online,而且要保存到/opt/hosts.txt文件当中
ping -c 3 $1
if [ $? -eq 0 ]
then
echo "ip is online"
echo $1 >> /opt/hosts.txt
else
echo "ip is offline "
fi
#随机输入一个整数,read -p输入一个数
#判断这个数是偶数还是奇数,偶数提示偶数,奇数提示奇数
read -p "随机一个整数:" a
if [[ a%2 -eq 0 ]]
then
echo "偶数"
else
echo "奇数"
fi
~
多分支结构
多分支结构:哪个条件满足,执行哪个条件
#请输入您的分数,0-100
大于等于85,且小于等于100优秀
大于等于70,
且小于等于84
一般
大于等于60,且小于等于69 合格
小于60,30遍
read -p "请输入你的分数:" a
if [[ a -ge 85 && a -le 100 ]]
then
echo "优秀"
elif [ $a -ge 70 -a $a -le 84 ]
then
echo "一般"
elif [ $a -ge 60 -a $a -le 69 ]
then
echo "合格"
else
echo "抄30遍"
fi
~
#num白定义输入,只有整数才可以进入到分数的区间。
#嵌套if
read -p "请输入你的分数:" a
if [[ a -eq a ]] &> /dev/null
then
if [[ a -ge 85 && a -le 100 ]]
then
echo "优秀"
elif [ $a -ge 70 -a $a -le 84 ]
then
echo "一般"
elif [ $a -ge 60 -a $a -le 69 ]
then
echo "合格"
else
echo "抄30遍"
fi
else
echo "输入非法,不是整数"
fi
case语句
read -p "输入一个成绩:" a
[[ $a -ge 80 && $a -le 100 ]] && b="great"
[[ $a -ge 60 && $a -le 79 ]] && b="standard"
[[ $a -ge 0 && $a -le 59 ]] && b="false"
case $a in
great)
echo "$a,优秀"
;;
stadnard)
echo "$a 一般"
;;
false)
echo "$a 及格"
;;
*)
echo "菜就多练"
esac