Shell脚本中条件判断的原理与使用教学

 更新时间:2026年04月08日 09:32:45   作者:.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 注意

  1. [ ]表示条件测试。注意这里的空格很重要。要注意在[ x ]前面都必须要有空格
  2. shell中,thenfi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
  3. 注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错。
  4. 判断是不支持浮点值的。
  5. 如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意。
  6. 默认,运行if语句中的命令,所产生的错误信息。仍然出现在脚本的输出结果中。
  7. 使用-z或者-n来检查长度的时候,没有定义的变量也为0
  8. 空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
  9. $?变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

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脚本判断使用的资料请关注脚本之家其它相关文章!

相关文章

  • shell字符串匹配的实现

    shell字符串匹配的实现

    这篇文章主要介绍了shell字符串匹配的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 使用shell脚本分析网站日志统计PV、404、500等数据

    使用shell脚本分析网站日志统计PV、404、500等数据

    这篇文章主要介绍了使用shell脚本分析网站日志统计PV(浏览量)、404、500等数据,用一个脚本来实现,需要的朋友可以参考下
    2014-05-05
  • Linux系统links和elinks命令的基本使用教程

    Linux系统links和elinks命令的基本使用教程

    links和elinks都是Linux系统下的命令行浏览器,主要用于在终端中查看网页内容,这篇文章主要介绍了Linux系统之links和elinks命令的基本使用,需要的朋友可以参考下
    2023-09-09
  • Linux进程通信(IPC)方式简介

    Linux进程通信(IPC)方式简介

    linux下进程间通信的几种主要方式:管道(pipe)和有名管道(FIFO)、信号(signal)、消息队列、共享内存(shared memory)、信号量(semaphore)、套接字(socket),本文对这些做简单介绍
    2013-12-12
  • 对Shell 脚本加密的方法

    对Shell 脚本加密的方法

    shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件
    2013-01-01
  • 浅析使用 Auditbeat 模块监控 shell 命令的问题

    浅析使用 Auditbeat 模块监控 shell 命令的问题

    Auditbeat Audited 模块可以用来监控所有用户在系统上执行的 shell 命令,在终端用户偶尔才会登录的服务器上,通常需要进行监控,本文给大家介绍使用 Auditbeat 模块监控 shell 命令的相关知识,感兴趣的朋友一起看看吧
    2022-02-02
  • shell脚本中使用return和exit的方法

    shell脚本中使用return和exit的方法

    return和exit各有用途,合理使用可以使shell编程更规范可控,return是一个关键字, exit是一个函数,这篇文章主要介绍了shell脚本之如使用return和exit,需要的朋友可以参考下
    2023-08-08
  • Shell字符串截取的实现方法(非常详细)

    Shell字符串截取的实现方法(非常详细)

    这篇文章主要介绍了Shell字符串截取的实现方法(非常详细),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • shell学习之printf命令格式化输出语句

    shell学习之printf命令格式化输出语句

    printf命令模仿C程序库(library)里的printf()库程序(library routine)。它几乎复制了该函数的所有功能。不过在Shell层级的版本上,会有些差异。下面这篇文章就给大家主要介绍了shell中printf命令格式化输出语句的相关资料,需要的朋友可以参考下。
    2017-01-01
  • 如何利用shell开发keepalived启动脚本

    如何利用shell开发keepalived启动脚本

    Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。这篇文章主要介绍了使用shell开发keepalived启动脚本,需要的朋友可以参考下
    2020-03-03

最新评论