目录
[test测试文件的表达式 是否成立](#test测试文件的表达式 是否成立)
[且 (全真才为真)](#且 (全真才为真))
[或 (一真即为真)](#或 (一真即为真))
[[[ expression ]] 用法](#[[ expression ]] 用法)
[( ){ } 可以将多个命令组合在一起,批量执行](#( ){ } 可以将多个命令组合在一起,批量执行)
测试
test测试文件的表达式 是否成立
格式
1.test 条件表达式
-
条件表达式 \] (注意\[ \]空格,否则会失败)
选项
-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  { } 不会开启子进程  ## 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 ``` ####  ###### 判断主机连通性 ```bash #!/bin/bash ping -c 3 192.168.17.2 if [ $? = 0 ] then echo "与真机网络通畅" exit 1 fi echo "与真机不通" ```  #### 多分支 ##### 考试成绩 ```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 ```  ## 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 ```  ##### 石头剪刀布 ```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 ```  ## echo echo -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符 不换行显示  \\c 使用在数字中间会把后面内容删除  ## date date查看当前系统时间 -d 你描述的日期,显示指定字符串所描述的时间,而非当前时间 %F 完整日期格式,等价于 %Y-%m-%d % T 时间(24小时制)(hh:mm:ss  cal 2023  ## seq 从1 开始 步长为2 到10 为止  从 20开始 步长为 -1 到1 为止 