shell 条件语句

目录

测试

[test测试文件的表达式 是否成立](#test测试文件的表达式 是否成立)

格式

选项

比较整数数值

格式

选项

字符串比较

常用的测试操作符

格式

逻辑测试

格式

[且 (全真才为真)](#且 (全真才为真))

[或 (一真即为真)](#或 (一真即为真))

常见条件

双中括号

[[[ expression ]] 用法](#[[ expression ]] 用法)

[( ){ } 可以将多个命令组合在一起,批量执行](#( ){ } 可以将多个命令组合在一起,批量执行)

if语句的结构

分支结构

单分支

双分支

多分支

举例

单分支

判断是否为超级管理员

​编辑

判断主机连通性

多分支

考试成绩

case

格式

字符

例子

考试成绩

石头剪刀布

echo

date

seq


测试

test测试文件的表达式 是否成立

格式

1.test 条件表达式

  1. 条件表达式 \] (注意\[ \]空格,否则会失败)

选项

-d:测试是否为目录(Directory)

bash 复制代码
[root@localhost ~]# test -d /etc/
[root@localhost ~]# echo $?
0

-e:测试目录或文件是否存在(Exist)

bash 复制代码
[root@localhost ~]# test -e /etc
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -e /fwf
[root@localhost ~]# echo $?
1

-a:测试目录或文件是否存在(Exist)

bash 复制代码
[root@localhost ~]# test -a /etc
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -a /fwf
[root@localhost ~]# echo $?
1

a和e的区别在于a不可以取非

bash 复制代码
[root@localhost ~]#[ ! -e /etc/shadow ]
[root@localhost ~]#echo $?
1
[root@localhost ~]#[ ! -a /etc/shadow ]
[root@localhost ~]#echo $?
0

-f:测试是否为文件(File)

bash 复制代码
[root@localhost ~]# test -f /etc/init.d
[root@localhost ~]# echo $?
1
[root@localhost ~]# test -f /etc/yum.conf
[root@localhost ~]# echo $?
0

-r:测试当前用户是否有权限读取(Read)

-w:测试当前用户是否有权限写入(Write)

-x:测试当前用户是否有权限执行(eXcute)

root执行权限别人没有root也没有,别人有root也有

bash 复制代码
[root@localhost 123]# ll /etc/shadow
----------. 1 root root 1266 11月  8 13:21 /etc/shadow
[root@localhost 123]# [ -r /etc/shadow ]
[root@localhost 123]# echo $?
0
#实际效果,不是表面显示,注意root权限
[root@localhost 123]# [ -x /etc/shadow ]
[root@localhost 123]# echo $?
1
#root执行权限别人没有root也没有,别人有root也有
[root@localhost 123]# 

-L: 测试是否为软连接文件

bash 复制代码
[root@localhost /]# test -L /etc/localtime
[root@localhost /]# echo $?
0
[root@localhost /]# test -L /etc/yum.conf
[root@localhost /]# echo $?
1
[root@localhost /]# 

测试是否成功使用 $? 返回值(0为正确,非0不正确)

比较整数数值

格式

整数1 -操作符 整数2 \] 公式 ### 选项 -eq:第一个数等于(Equal)第二个数 -ne:第一个数不等于(Not Equal)第二个数 -gt:第一个数大于(Greater Than)第二个数 -lt:第一个数小于(Lesser Than)第二个数 -le:第一个数小于或等于(Lesser or Equal)第二个数 -ge:第一个数大于或等于(Greater or Equal)第二个数 ```bash [root@localhost /]# a=6 [root@localhost /]# b=9 [root@localhost /]# [ $a -eq $b ] [root@localhost /]# echo $? 1 [root@localhost /]# [ $a -le $b ] [root@localhost /]# echo $? 0 [root@localhost /]# ``` ## 字符串比较 ### **常用的测试操作符** =:字符串内容相同 !=:字符串内容不同,! 号表示相反的意思 -z:字符串内容为空 -n: 字符是否存在 #### 格式 \[ 字符串1 = 字符串2 \] 是否相同 ```bash [root@localhost /]# qwe=xuyucheng [root@localhost /]# rty=taishuail [root@localhost /]# [ $qwe = $rty ] [root@localhost /]# echo $? 1 [root@localhost /]# rty=xuyucheng [root@localhost /]# [ $qwe = $rty ] [root@localhost /]# echo $? 0 [root@localhost /]# ``` \[ 字符串1 != 字符串2 \] 是否不相同 ```bash [root@localhost /]# qwe=xuyucheng [root@localhost /]# rty=taishuail [root@localhost /]# [ $qwe != $rty ] [root@localhost /]# echo $? 0 ``` \[ -z 字符串 \] 是否为空 ```bash [root@localhost /]# rty=taishuail [root@localhost /]# [ -z $rty ] [root@localhost /]# echo $? 1 [root@localhost /]# rty=" " [root@localhost /]# [ -z $rty ] [root@localhost /]# echo $? 0 [root@localhost /]# ``` \[ -n 字符串 \] 字符是否存在 ## 逻辑测试 #### 格式 1. \[ 表达式1 \] 操作符 \[ 表达式2 \] ... 2. 命令1 操作符 命令2 ... #### 且 (全真才为真) 第一个要真 第二 个也要真 才能是真 如果第一个为假 ,整个 就为假 不用执行下个操作 cmd1 \&\& cmd2 #### 或 (一真即为真) 如果第一个 为真 那么 不用执行第二个 第一个为假 ,才需要执行第二个 cmd1 \|\| cmd2 #### 常见条件 -a或\&\&:逻辑与,"而且"的意思全真才为真 -o或\|\|:逻辑或,"或者"的意思一真即为真 !:逻辑否 ## 双中括号 #### \[\[ expression \]\] 用法 == 左侧字符串是否和右侧的PATTERN相同 注意:此表达式用于\[\[ \]\]中,PATTERN(元字符)为通配符 =\~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配 注意: 此表达式用于\[\[ \]\]中;扩展的正则表达式 ```bash [root@localhost ~]# xuc=tre.log [root@localhost ~]# [[ "$xuc" == *.log ]] //是否有.log结尾的 [root@localhost ~]# echo $? 0 [root@localhost ~]# xuc=tre.text //将字符串重新定义 [root@localhost ~]# [[ "$xuc" == *.log ]] //是否有.log结尾的 [root@localhost ~]# echo $? 1 [root@localhost ~]# [[ "$xuc" != *.log ]] //!取反 是否没有.log结尾的 [root@localhost ~]# echo $? 0 [root@localhost ~]# ``` ## ( ){ } 可以将多个命令组合在一起,批量执行 ```bash [root@localhost ~]# (cd /opt;ls) 999 nginx-1.18.0 qqq.sh test2 aa nginx-1.18.0.tar.gz rh a.tar.gz nginx-1.18.0.tar.gz.0 test etc qqq test1 ``` ( )会开启子shell ![](https://file.jishuzhan.net/article/1727527711422812162/a927eb60813e4ba097f936f8a115ce61.webp) { } 不会开启子进程 ![](https://file.jishuzhan.net/article/1727527711422812162/a29ae50c2c1dd82d1d9428ad7d9f0254.webp) ## if语句的结构 if语句 单分支 判断条件 成功执行 不成功 不执行 #### 分支结构 ##### 单分支 if 判断条件; then 条件为真的分支代码 fi ##### 双分支 if 判断条件;then 条件为假的分支代码 fi ##### 多分支 if 判断条件1 then 条件1为真的分支代码 elif 判断条件2 then 条件2为真的分支代码 elif 判断条件3;then 条件3为真的分支代码 ... else 以上条件都为假的分支代码 托底 fi ### 举例 #### 单分支 ###### 判断是否为超级管理员 ```bash #!/bin/bash if [ "$USER" != "root" ] then echo "非用户管理员" else echo "是管理员用户" fi ``` #### ![](https://file.jishuzhan.net/article/1727527711422812162/655092f9a449585eae8e602545c80c2d.webp) ###### 判断主机连通性 ```bash #!/bin/bash ping -c 3 192.168.17.2 if [ $? = 0 ] then echo "与真机网络通畅" exit 1 fi echo "与真机不通" ``` ![](https://file.jishuzhan.net/article/1727527711422812162/f8df7c5df39a71ebf58695113de03bc0.webp) #### 多分支 ##### 考试成绩 ```bash #!/bin/bash read -p "请输入你的成绩:" cj if [ $cj -ge 85 ]&&[ $cj -le 100 ] then echo "你的成绩为$cj" echo "你的成绩为优秀" elif [ $cj -ge 70 ]&&[ $cj -le 84 ] then echo "你的成绩为$cj" echo "你的成绩为良好" elif [ $cj -ge 60 ]&&[ $cj -le 69 ] then echo "你的成绩为$cj" echo "你的成绩为合格" else echo "你的成绩为$cj" echo "你的成绩不合格" fi ``` ![](https://file.jishuzhan.net/article/1727527711422812162/f1772b6eca7f4f0abd9ba5a001f05279.webp) ## case #### 格式 case WORD in \[PATTERN \[\| PATTERN\]...) COMMANDS ;;\]... esac read -p case $num in 条件判断1) 命令序列) ;; 条件判断2) 命令序列2) ;; esac #### 字符 \* 任意长度任意字符 ? 任意单个字符 \[0-9\] 指定范围内的任意单个字符 \| 或者,如: a\|b #### 例子 ##### 考试成绩 ```bash [root@localhost qqq]# bash 4.sh 请输入你的分数4 4 不及格 [root@localhost qqq]# cat 4.sh #!/bin/bash read -p "请输入你的分数" cj case $cj in 100) echo "$cj 你好棒!" ;; [89][0-9]) echo "$cj 一般般吧,仍需努力" ;; [67][0-9]) echo "$cj 及格" ;; [0-9]|[1-5][0-9]) echo "$cj 不及格" ;; *) echo "输入有误" esac ``` ![](https://file.jishuzhan.net/article/1727527711422812162/fda606cd7a8ee8dfb55967d5d54a9f63.webp) ##### 石头剪刀布 ```bash #!/bin/bash m=`echo $[RANDOM%3+1]` read -p "请输入 1.石头2.剪刀3.布:" h if [ $m -eq $h ] then echo "打成平局" bash $0 elif [ $h -eq 1 -a $m -eq 2 -o $h -eq 2 -a $m -eq 3 -o $h -eq 3 -a $m -eq 1 ] then echo "人类胜利" else echo 机器胜利 fi #!/bin/bash key=`echo $[RANDOM%3+1]` read -p "请输入1包子 2剪子 3 锤子:" num case $num in 1) num="包子" ;; 2) num="剪子" ;; 3) num="锤子" ;; *) echo "你输错了!" exit ;; esac case $key in 1) key="包子" ;; 2) key="剪子" ;; 3) key="锤子" ;; esac if [ $num = "包子" -a $key = "锤子" -o $num = "剪子" -a $key = "包子" -o $num = "锤子" -a $key = "剪子" ] then echo 机器出的是$key echo 你出的是$num echo "人类胜利" elif [ $num = $key ] then echo 机器出的是$key echo 你出的是$num echo "打成平局再来一次" else echo 机器出的是$key echo 你出的是$num echo "机器胜利" fi ``` ![](https://file.jishuzhan.net/article/1727527711422812162/81bc90f22115489dc7b892573f8ab8a7.webp) ## echo echo -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符 不换行显示 ![](https://file.jishuzhan.net/article/1727527711422812162/160c519563eae7ea090994dda87f3015.webp) \\c 使用在数字中间会把后面内容删除 ![](https://file.jishuzhan.net/article/1727527711422812162/6b95fcc098da0ec41980b5befdb7ec37.webp) ## date date查看当前系统时间 -d 你描述的日期,显示指定字符串所描述的时间,而非当前时间 %F 完整日期格式,等价于 %Y-%m-%d % T 时间(24小时制)(hh:mm:ss ![](https://file.jishuzhan.net/article/1727527711422812162/dc816dde4ddf4651be802ebb89ea8533.webp) cal 2023 ![](https://file.jishuzhan.net/article/1727527711422812162/d2e163314d117f9571a5004c9c0c6dd8.webp) ## seq 从1 开始 步长为2 到10 为止 ![](https://file.jishuzhan.net/article/1727527711422812162/09d901fa86a0ddec400730fc61d2f46b.webp) 从 20开始 步长为 -1 到1 为止 ![](https://file.jishuzhan.net/article/1727527711422812162/015e0f6e0a4839755598e1c3c5296aea.webp)

相关推荐
tan77º5 分钟前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
czhc114007566316 分钟前
Linux 76 rsync
linux·运维·python
szxinmai主板定制专家1 小时前
【精密测量】基于ARM+FPGA的多路光栅信号采集方案
服务器·arm开发·人工智能·嵌入式硬件·fpga开发
你不知道我是谁?1 小时前
负载均衡--四层、七层负载均衡的区别
运维·服务器·负载均衡
蓝易云1 小时前
Qt框架中connect()方法的ConnectionType参数使用说明 点击改变文章字体大小
linux·前端·后端
dyj0952 小时前
【Rancher Server + Kubernets】- Nginx-ingress日志持久化至宿主机
运维·nginx·rancher
花落已飘2 小时前
多线程 vs 异步
linux·网络·系统架构
PanZonghui2 小时前
Centos项目部署之Nginx部署项目
linux·nginx
九丝城主2 小时前
2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--中篇
服务器·flutter·macos·vmware
码出钞能力3 小时前
linux内核模块的查看
linux·运维·服务器