目录
绪论:
条件判断:
0:true 真
非零: false 假
1、条件测试命令:test
第一种格式:test+条件测试的表达式
选项 | 作用 |
-e | 测试目录或者文件是否存在。最后echo $? 看返回值 |
-d | 只测试目录是否存在 |
-f | 测试文件是否存在 |
-r | 测试当前用户是否有读权限 |
-w | 测试当前用户是否有写权限 |
-r | 测试当前用户是否有执行权限 |
执行权测试的是当前用户,你在什么用户下就是测试的什么用户的权限
第二种格式:[ -e /opt/123.txt ] 注意,两边都有空格
2、整数表达式
选项 | 说明 |
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-le | 小于等于 |
-ge | 大于等于 |
以上英文格式的整数比较表达式,只能用于比较整数
eg:[ 2 -eq 3 ]
以下可以用于整数,也可以用于字符串,但是字符串只能比较是否相同
== | 等于 |
!= | 不等于 |
>= | 大于等于 |
> | 大于 |
<= | 小于等于 |
< | 小于 |
3、逻辑测试
常用的测试操作符
-a 或 && :表示逻辑与,前后两个条件都要满足
-o 或 | | : 逻辑或关系,满足一个条件即可
eg:
a=4
[ "$a" -ne 1 ] && [ "$a" > 3 ] 右边的> 可能会导致歧义,可以换成-gt
echo $?
字符串最好用引号进行引用
注意:直接引用变量时最好用引号引起来,特殊符号要慎用
-a和-o的方式:
[ "$a" -ne 1 -o "$a" -gt 5 ]
特殊格式:格式[ ]和[[ ]]意思相同,都是条件测试的语句,都可以判断真假,但是有区别
双中括号的功能更加强大,不用给变量加引号,不会出现歧义,支持模式匹配、正则表达式
eg:[[ $a != 1 && $a > 5 ]] 这里可以用符号> ,但是不能用-a或者-o
4、if语句
4.1 单分支结构
命令格式:
if 条件测试操作
then 命令序列
fi
eg:
vim if.sh 进入
if [[ 3 -gt 2 ]]
then
echo "0k"
fi
或者格式:if [[ 3 -gt 2 ]]; then echo "ok"; fi
保存退出 sh
eg:用户自定义两个变量
第一种read方式:
vim bianliang.sh
输入:
read -p "请输入第一个数字:" a
read -p "请输入第二个数字:" b
if [[ $a -gt $b ]]
then
echo "0k"
fi
第二种传参方式:
num1=$1
num2=$2
if [[ $num1 -gt $num2 ]]
then
echo "0k"
fi
4.2 双分支结构
if 条件测试操作
then 命令序列1
else 命令序列2
fi
eg:ping IP地址,平的通的就放到/opt/hosts.txt,ping不通的提示不在线offline
read -p "请输入一个IP地址:" ip
ping -c 5 $ip (&> /dev/null 此命令表示把命令的执行过程放到黑洞,没有括号)
if [[ $! -eq 0 ]]
then
echo $ip >> /opt/hosts.txt
else
echo "offline"
fi
4.3 多分支结构 elif
eg:提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
eg:现有考试成绩需要录入,90-100分为优秀,70-80为一般,60-79分为及格,60分一下为不及格
vim test.sh
read -p "请输入考试成绩:" test
if [[ $test -ge 90 && $test -le 100 ]]
then
echo "优秀"
4.4 嵌套语句
vim test.sh
read -p "请输入考试成绩:" test
if [[ $test -ge 90 && $test -le 100 ]]
then
echo "优秀"
fi
if [[ $test -ge 70 && $test -le 89 ]]
then
echo "一般"
else
echo "其它"
fi
eg:提示用户输入内容,使用if 语句判断输入的内容是否为整数。再判断输入的内容是奇数还是偶数。
判断奇偶性:
5、case多分支结构
应用场景:
某个便便量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列,与if多分枝结构分长相似,只不过if语句需要判断多个不同的条件而case语句只是判断一个变量的不同取值
格式:
case 变量值 in
模式一)
命令序列
;;
模式二)
命令序列
;;
*)
esac
eg:
vim case.sh
read -p "请输入一个数字:" score
[[ $score -ge 80 && $score -le 100 ]] && a="great" 意思是如果在80-100就赋值给a为great
[[ $score -ge 60 && $score -le 79 ]] && a="so"
great)
echo "${score}分,优秀"
;;
so)
echo "${score}分,一般"
;;
*)
echo "不及格"
esac
保存退出
bash -x case.sh 可以定位脚本的语法逻辑结构
eg:用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录
eg:用case语句控制 firewalld start|stop|restart|status 来管理firewalld服务,
要求如果命令选项不对,则提示输入不正确