文章目录
控制语句-test 、IF、CASE
一、条件测试操作——test
Shell环境根据命令执行后的返回状态值, $?来判断是否执行成功,当返回值为0(真true)时表示成功,返回值为非0值(假false)时表示失败或异常。
test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立($?返回值为 0 表示条件成立)。
- 格式一:test <条件表达式>
- 格式二:[ <条件表达式> ] ##中括号内在条件表达式左右必须至少有一个空格
1.1、文件测试
- 格式:[ 操作符 文件或目录 ]
常用的操作符:
操作符 | 含义 |
---|---|
-e | 测试目录或文件是否存在(Exist)。 |
-d | 测试是否为目录(Directory)。 |
-f | 测试是否为文件(File)。 |
-r | 测试当前用户是否有权限读取(Read)。 |
-w | 测试当前用户是否有权限写入(Write)。 |
-x | 测试是否设置有可执行(Excute)权限。 |
-L | 测试是否为符号链接 |
1.2、整数值比较
- 格式:[ 整数变量1 操作符 整数变量2 ]
常用的操作符:
操作符 | 含义 |
---|---|
-eq 、 (==) | 等于 |
-ne 、 (!=) | 不等于 |
-gt 、 (>) | 大于 |
-lt 、 (<) | 小于 |
-le 、 (<=) | 小于等于 |
-ge 、 (>=) | 大于等于 |
1.3、字符串比较
-
格式1:
[ 字符串1 = 字符串2 ] 或 [[ 字符串1 == 字符串2 ]] #相同
[ 字符串1 != 字符串2 ] 或 [[ 字符串1 != 字符串2 ]] #不相同
[[ 字符串1 =~ 字符串2 ]] #包含 -
格式2:
[ -z “字符串” ] #检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串
[ -n “字符串” ] #检查是否有字符串存在
1.4、逻辑测试
-
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
-
格式2:命令1 操作符 命令2
1.5、常用的操作符:
-
-a或&& :逻辑与,“而且”的意思,前后条件需都成立
-
-o或|| :逻辑或,“或者”的意思,只需前后条件中一个成立
-
! :逻辑否
二、控制语句——”if“
2.1、单分支
通过此结构,如果满足给定条件,将采取一个或多个操作。如果不满足给定条件,则不采取任何操作。前面演示的数字、字符串和文件测试经常用于在 if/then 语句中测试条件。末尾的fi语句用于结束if/then 结构。
if <条件测试操作>
then
<命令序列>
fi
以下代码段演示了使用 if/then结构来启动sshd服务。
示例:
#使用if单分支判断sshd服务是否开启,若正常开启屏幕提示”sshd服务已经开启“
vim 1.sh
#!/bin/bash
systemctl is-active sshd &>/dev/null
if [ $? -eq 0 ]
then
echo "sshd服务已经开启"
fi
chmod +x 1.sh
./1.sh
2.2、双分支
if/then 结构可以进一步扩展,以便能够根据是否满足条件来采取不同的操作集合。
以下示例中显示了其结构:
if <条件测试操作>
then
<命令序列>
else
<命令序列>
fi
以下代码段演示了使用 if/then/else 语句来启动 sshd 服务(如果其未处于活动状态)和提示该服务已启动(如果其处于活动状态)。
示例:
#使用if双分支判断sshd服务是否开启,若正常开启屏幕提示”sshd服务已经开启“,如果没有开启,启动sshd服务并提示”sshd服务已经开启“
vim 2.sh
#!/bin/bash
systemctl is-active sshd &>/dev/null
if [ $? -ne 0 ]
then
systemctl start sshd
echo "sshd服务已经开启"
else
echo "sshd服务已经开启"
fi
chmod +x 2.sh
./2.sh
2.3、多分支
if/then/else结构可以进一步扩展以测试多个条件:在满足某个条件时执行不同的操作集合。
以下示例中显示了其结构:
if <条件测试操作1>
then
<命令序列>
elif<条件测试操作2>
then
<命令序列>
[else]
[<命令序列>]
fi
在此条件结构中,Bash将按照显示的顺序测试条件。在发现某个条件成立后,Bash将执行与该条件相关联的操作,然后跳过条件结构的其余部分。如果所有条件均不成立,Bash将执行else子句中枚举的操作。
示例:
vim 3.sh
#!/bin/bash
if [ "$1" == "start" ]
then
systemctl start sshd
echo "sshd服务已开启"
elif [ $1 == "stop" ]
then
systemctl stop sshd
echo "正在关闭sshd服务"
elif [ $1 == "status" ]
then
systemctl status sshd
elif [ $1 == "restart" ]
then
systemctl restart sshd
echo "正在重启sshd服务"
else
echo "请使用:start|stop|status|restart 字符"
fi
chmod +x 3.sh
./3.sh start
.3.sh status
三、控制语句——”case“
case 变量值 in
表达式1)
命令序列 1
;;
表达式2)
命令序列 2
;;
……
* )
命令序列
esac
示例:
##用case语句写一个sshd脚本,并加入到系统服务管理中,使能够使用 service sshd start|stop|restart|status 来管理sshd服务,
##要求如果命令选项不对,则提示 “用法: $0 {start|stop|status|restart}”。
vim 4.sh
case $1 in
start)
systemctl start sshd
;;
stop)
systemctl stop sshd
;;
restart)
$0 stop
$0 start
;;
status)
systemctl status sshd
;;
* )
echo "用法: $0 {start|stop|status|restart}"
esac