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)

相关推荐
无敌小茶2 分钟前
Linux学习笔记之环境变量
linux·笔记
Harbor Lau15 分钟前
Linux常用中间件命令大全
linux·运维·中间件
漫谈网络33 分钟前
基于 Netmiko 的网络设备自动化操作
运维·自动化·netdevops·netmiko
꧁坚持很酷꧂1 小时前
Linux Ubuntu18.04下安装Qt Craeator 5.12.9(图文详解)
linux·运维·qt
凉、介1 小时前
PCI 总线学习笔记(五)
android·linux·笔记·学习·pcie·pci
电鱼智能的电小鱼2 小时前
EFISH-SBC-RK3588无人机地面基准站项目
linux·网络·嵌入式硬件·机器人·无人机·边缘计算
电鱼智能的电小鱼2 小时前
基于 EFISH-SBC-RK3588 的无人机环境感知与数据采集方案
linux·网络·嵌入式硬件·数码相机·无人机·边缘计算
小诸葛的博客2 小时前
详解Linux中的定时任务管理工具crond
linux·运维·chrome
一默19913 小时前
CentOS 7.9升级OpenSSH到9.9p2
linux·运维·centos
keep intensify3 小时前
Linux常用指令
linux·服务器·php