Shell脚本中条件判断的原理与使用教学
作者:.Kaser.
这篇文章主要为大家详细介绍了Shell编程中的条件判断和流程控制,包括条件测试、if语句、模式匹配等内容,文中的示例代码讲解详细,希望对大家有所帮助

无论什么编程语言都离不开条件判断(流控);
1.Shell条件测试
1.1 数值比较
[ 整数1 操作符 整数2 ] [ -gt ] # 大于 [ -lt ] # 小于 [ -eq ] # 等于 [ -ne ] # 不等于 [ -ge ] # 大于等于 [ -le ] # 小于等于
1.2 测试语法
test 条件表达式 [ 条件表达式 ] [[ 条件表达式 ]]
1.3 文件测试
-f # 路径是否存在 -b # 路径是否是块设备文件 -d # 路径是否是目录 -h/-L # 路径是否为连接文件 ......
示例
[root@shell-test ~]# vim Test-1.sh #!/bin/bash read -p "请输入你要进行检测的目录:" path if [ -d $path ] then echo "$path存在,不需要创建。" else echo "警告:$path不存在,请开始创建。" fi [root@shell-test ~]# chmod +x Test-1.sh [root@shell-test ~]# ./Test-1.sh 请输入你要进行检测的目录:/etc/test 警告:/etc/test不存在,请开始创建。 [root@shell-test ~]# ./Test-1.sh 请输入你要进行检测的目录:/mnt /mnt存在,不需要创建。
1.4 字符串比较
[ "字符串" = "字符串"] [ "字符串" != "字符串"]
示例
1.=示例
[root@shell-test ~]# vim Test-2.sh #!/bin/bash read -p "先生,请问您需要办卡么,今天是史上最大的一次打折!(yes/no): " input if [ "$input" = "yes" ] then echo "哈哈哈哈哈哈哈,大佬,谢谢支持小弟的工作!" else echo "哈哈哈,确实挣钱不容易,您要是有想法了,可以找我了,您慢走。" fi [root@shell-test ~]# chmod +x Test-2.sh [root@shell-test ~]# ./Test-2.sh 先生,请问您需要办卡么,今天是史上最大的一次打折!(yes/no): yes 哈哈哈哈哈哈哈,大佬,谢谢支持小弟的工作! [root@shell-test ~]# ./Test-2.sh 先生,请问您需要办卡么,今天是史上最大的一次打折!(yes/no): no 哈哈哈,确实挣钱不容易,您要是有想法了,可以找我了,您慢走。
2.!=示例
[root@shell-test ~]# vim Test-2.sh #!/bin/bash read -p "先生,请问您需要办卡么,今天是史上最大的一次打折!(yes/no): " input if [ "$input" != "no" ] then echo "哈哈哈哈哈哈哈,大佬,谢谢支持小弟的工作!" else echo "哈哈哈,确实挣钱不容易,您要是有想法了,可以找我了,您慢走。" fi [root@shell-test ~]# chmod +x Test-2.sh [root@shell-test ~]# ./Test-2.sh 先生,请问您需要办卡么,今天是史上最大的一次打折!(yes/no): yes 哈哈哈哈哈哈哈,大佬,谢谢支持小弟的工作! [root@shell-test ~]# ./Test-2.sh 先生,请问您需要办卡么,今天是史上最大的一次打折!(yes/no): no 哈哈哈,确实挣钱不容易,您要是有想法了,可以找我了,您慢走。
1.5and与or
当条件测试比较复杂时,需要多个条件同时成立,就需要混合条件测试了。
&& -a 两个条件同时成立时,为真。 || -o 两个条件一个成立,即为真。
[root@shell-test ~]# vim Test-3.sh
echo "
新密码要求:
1.长度大于等于7位
2.包含字母大写
3.包含字母小写
4.包含符号“@!_”
"
read -p "请您输入新密码: " pass
if [ ${#pass} -ge 7 ] && [[ ${pass} =~ [a-z] ]] && [[ ${pass} =~ [A-Z] ]] && [[ ${pass} =~ [@_!] ]]
then echo "您的密码真复杂!!!"
else echo "您的密码太简单!!!"
fi
[root@shell-test ~]# chmod +x Test-3.sh
[root@shell-test ~]# ./Test-3.sh
新密码要求:
1.长度大于等于7位
2.包含字母大写
3.包含字母小写
4.包含符号“@!_”
请您输入新密码: Admin@123
您的密码真复杂!!!
2.流程控制if
2.1 单分支结构
语法
if [ 条件测试 ] ;then fi
示例
需求:
用户输入用户名,如果用户不存在,则创建该用户。
[root@shell-test ~]# vim test.sh
#!/bin/bash
echo '$$$$ User_Add $$$$'
read -p "请输入你要新建的用户:" user
id $user &> /dev/null
if [ $? -ne 0 ]
then
useradd $user
echo "$user已创建!"
fi
[root@shell-test ~]# chmod +x test.sh
[root@shell-test ~]# ./test.sh
$$$$ User_Add $$$$
请输入你要新建的用户:oop
oop已创建!
2.2 双分支结构
语法
if 条件测试 then 命令序列 else 命令序列 fi
示例
[root@shell-test ~]# vim test.sh
#!/bin/bash
echo '$$$$ User_Add $$$$'
read -p "新建用户名:" user
id $user &> /dev/null
if [ $? -ne 0 ]
then
useradd $user
echo "123456" | passwd --stdin $user &> /dev/null
echo
id $user
echo "$user已创建,默认密码为:123456,请及时修改。"
else
id $user
echo
echo "此用户已存在,不需要创建。"
fi
[root@shell-test ~]# chmod +x test.sh
[root@shell-test ~]# ./test.sh
$$$$ User_Add $$$$
新建用户名:ok
uid=1008(ok) gid=1008(ok) groups=1008(ok)
ok已创建,默认密码为:123456,请及时修改。
[root@shell-test ~]# ./test.sh
$$$$ User_Add $$$$
新建用户名:ok
uid=1008(ok) gid=1008(ok) groups=1008(ok)
此用户已存在,不需要创建。
2.3 多分支结构
语法
多分支结构 if 条件测试1 then 命令序列 elif 条件测试2 then 命令序列 elif 条件测试3 then 命令序列... else 命令序列 fi
示例
[root@shell-test ~]# vim time_Warn.sh
#!/bin/bash
echo "##判断系统时间##"
hour=`date +%H`
time=`date +%H:%M:%S`
echo "$time是您当前时间..."
echo
if [[ $hour -ge 6 && $hour -lt 10 ]]
then
echo "早晨时间,喝杯咖啡,运动一下吧!"
elif [[ $hour -ge 10 && $hour -lt 13 ]]
then
echo "中午时间,吃点午餐,休息一下吧!"
elif [[ $hour -ge 13 && $hour -lt 20 ]]
then
echo "下午时间,好好工作,专注一下吧!"
else
echo "夜晚时间,快快,休息一下吧!"
fi
[root@shell-test ~]# chmod +x time_Warn.sh
[root@shell-test ~]# ./time_Warn.sh
##判断系统时间##
15:58:12是您当前时间...
下午时间,好好工作,专注一下吧!
[root@shell-test ~]# ./time_Warn.sh
##判断系统时间##
15:58:16是您当前时间...
下午时间,好好工作,专注一下吧!
[root@shell-test ~]# date
Sat Mar 28 03:58:25 PM CST 2026
2.4 嵌套结构
语法
嵌套结构 if 条件测试1 ;then 命令序列 if 条件测试1 ;then 命令序列 else 命令序列 fi else 命令序列 fi
示例
[root@shell-test ~]# vim user_add_delete.sh
#!/bin/bash
echo "##### User_Add_Delete #####"
read -p "请输入新建用户名称:" name
id $name &> /dev/null
if [ $? -eq 0 ]
then
read -p "$name已存在,请问是否需要删除(yes/no)?" select
if [ "$select" = "yes" ]
then
userdel -r $name
id $name
echo "$name已经被删除。如果有需要新建用户,请重新执行此程序。"
else
echo "好的,我们不会删除$name,再见。"
fi
else
useradd $name
id $name
echo
echo "$name已创建。"
read -p "请输入密码(大于等于7位),谢谢。" pass
if [ ${#pass} -ge 7 ]
then
echo $pass | passwd --stdin $name
echo "$name的密码是$pass,应及时保存。"
else
read -p "你的密码不满足长度要求,请重新输入:" pass
if [ ${#pass} -ge 7 ]
then
echo $pass | passwd --stdin $name
echo "$name的密码是$pass,应及时保存。"
else
echo "你已触发保护原则,已退出此程序。"
fi
fi
fi
[root@shell-test ~]# chmod +x user_add_delete.sh [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 请输入新建用户名称:qwe qwe已存在,请问是否需要删除(yes/no)?yes id: ‘qwe': no such user qwe已经被删除。如果有需要新建用户,请重新执行此程序。 [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 请输入新建用户名称:qwe uid=1009(qwe) gid=1009(qwe) groups=1009(qwe) qwe已创建。 请输入密码(大于等于7位),谢谢。qwe 你的密码不满足长度要求,请重新输入:qwe 你已触发保护原则,已退出此程序。 [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 请输入新建用户名称:qwe qwe已存在,请问是否需要删除(yes/no)?no 好的,我们不会删除qwe,再见。 [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 请输入新建用户名称:asd uid=1010(asd) gid=1010(asd) groups=1010(asd) asd已创建。 请输入密码(大于等于7位),谢谢。111111 你的密码不满足长度要求,请重新输入:1111111 Changing password for user asd. passwd: all authentication tokens updated successfully. asd的密码是1111111,应及时保存。 [root@shell-test ~]# ./user_add_delete.sh ##### User_Add_Delete ##### 请输入新建用户名称:qqq uid=1011(qqq) gid=1011(qqq) groups=1011(qqq) qqq已创建。 请输入密码(大于等于7位),谢谢。123123123123 Changing password for user qqq. passwd: all authentication tokens updated successfully. qqq的密码是123123123123,应及时保存。
2.5 调试脚本
语法
sh -n xxx.sh # 只检测是否有语法错误 sh -vx xxx.sh # 观看过程
示例
[root@shell-test ~]# cat test-1.sh
#!/bin/bash
echo "裁员一定要快!有人截屏了!"
read -p "请输入姓名:" name
read -p "请输入工号:" number
read -s -p "请输入密码:" passwd # -s 静默输出,一般用于密码
echo
echo "$name,你被优化了,组织架构调整了,您的工号$number已经被注销了,您的密码也被我们刚刚销毁,无权登录系统,感谢您的付出!"
[root@shell-test ~]# sh -n test-1.sh
[root@shell-test ~]# sh -vx test-1.sh
which () { ( alias;
eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@
}
#!/bin/bash
echo "裁员一定要快!有人截屏了!"
+ echo 裁员一定要快!有人截屏了!
裁员一定要快!有人截屏了!
read -p "请输入姓名:" name
+ read -p 请输入姓名: name
请输入姓名:dhj
read -p "请输入工号:" number
+ read -p 请输入工号: number
请输入工号:001
read -s -p "请输入密码:" passwd # -s 静默输出,一般用于密码
+ read -s -p 请输入密码: passwd
请输入密码:echo
+ echo
echo "$name,你被优化了,组织架构调整了,您的工号$number已经被注销了,您的密码也被我们刚刚销毁,无权登录系统,感谢您的付出!"
+ echo dhj,你被优化了,组织架构调整了,您的工号001已经被注销了,您的密码也被我们刚刚销毁,无权登录系统,感谢您的付出!
dhj,你被优化了,组织架构调整了,您的工号001已经被注销了,您的密码也被我们刚刚销毁,无权登录系统,感谢您的付出!
2.6 注意
[ ]表示条件测试。注意这里的空格很重要。要注意在[ x ]前面都必须要有空格- 在
shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。 - 注意
if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错。 - 判断是不支持浮点值的。
- 如果只单独使用
>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意。 - 默认,运行
if语句中的命令,所产生的错误信息。仍然出现在脚本的输出结果中。 - 使用
-z或者-n来检查长度的时候,没有定义的变量也为0 - 空变量和没有初始化的变量可能会对
shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下 $?变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)
3.模式匹配case
3.1case语法
case 变量 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; 模式3) 命令序列3 ;; *) 无匹配后命令序列 ;; esac
3.2 示例-简单的模式匹配
[root@shell-test ~]# vim del_user.sh
#!/bin/bash
echo "### 删除用户的程序 ###"
read -p "请输入要删除的用户名:" name
id $name &> /dev/null
if [ $? -eq 0 ]
then
read -p "确认删除么(yes/no)?" action
case $action in
yes|y|Y|Ye|Yes|YE|YEs|YES|yeS|yES)
userdel -r $name
echo "$name已经被删除!"
;;
*)
echo "好的,我们未进行任何的改动,请放心!"
;;
esac
else
echo "$name不存在,不需要删除,再见。"
fi
[root@shell-test ~]# chmod +x del_user.sh
[root@shell-test ~]# ./del_user.sh
### 删除用户的程序 ###
请输入要删除的用户名:op
./del_user.sh: line 19: syntax error: unexpected end of file
[root@shell-test ~]# ./del_user.sh
### 删除用户的程序 ###
请输入要删除的用户名:op
op不存在,不需要删除,再见。
[root@shell-test ~]# useradd op
[root@shell-test ~]# ./del_user.sh
### 删除用户的程序 ###
请输入要删除的用户名:op
确认删除么(yes/no)?no
好的,我们未进行任何的改动,请放心!
[root@shell-test ~]# ./del_user.sh
### 删除用户的程序 ###
请输入要删除的用户名:op
确认删除么(yes/no)?yes
op已经被删除!
3.3 示例-简单的JumpServer
由于工作中,我们需要管理N多台服务器。那么访问服务器就是一件繁琐的事情。通过shell编程,编写跳板程序。当我们需要访问服务器时,看一眼服务器列表名,按一下数字,就登录成功了。岂不美哉。
[root@shell-test ~]# vim jump_server.sh
#!/bin/bash
echo "### 跳板主机 ###"
web1=172.25.254.61
web2=172.25.254.62
mysql1=172.25.254.63
cat <<EOF
1.web1
2.web2
3.mysql1
...
EOF
read -p "请输入跳转的主机数字(1,2,3):" num
case $num in
1)
ssh root@$web1
;;
2)
ssh root@$web2
;;
3)
ssh root@$mysql1
;;
*)
echo "没有此选项-已退出..."
esac
[root@shell-test ~]# chmod +x jump_server.sh [root@shell-test ~]# ./jump_server.sh ### 跳板主机 ### 1.web1 2.web2 3.mysql1 ... 请输入跳转的主机数字(1,2,3):
3.4 示例-系统管理工具箱
提供的丰富的管理命令,用户管理,内存管理,磁盘管理,进程管理,日志管理,文件管理,软件管理,网络管理等等数十个工具包。
如果你能通过shell编程,把他们编写到一个程序里。想用某些功能,只需要按回车,就能完成。岂不美哉。
[root@shell-test ~]# vim help_command.sh
#!/bin/bash
cat <<EOF
1. 磁盘工具
2. 挂载工具
3. 内存工具
q. 退出
此工具箱还在扩充功能...
EOF
read -p "请输入你需要使用的选项:" select
case $select in
1)
fdisk -l
echo "已查询..."
;;
2)
df -hT
echo "已查询..."
;;
3)
free -m
echo "已查询"
;;
q)
exit
;;
*)
echo "error......"
esac
以上就是Shell脚本中条件判断和流程控制语句的使用教学的详细内容,更多关于Shell脚本判断使用的资料请关注脚本之家其它相关文章!
