02 shell系列: shell条件判断(语法结构+条件判断示例)

277 阅读3分钟

本文目标:
了解shell条件判断语句有哪些判断语法:test [ ] [[ ]]
了解shell条件判断语句有哪些判断:如整数大小判断、字符串判断、文件是否存在判断等

一:条件判断语法格式

思考:shell中什么为真?什么是假?

在shell条件判断中0为真,非0为假 

shell中3种条件判断语法结构

格式示例(判断当前目录下file1文件是否存在)
test条件表达式test -e ./file1; echo $? (注意:条件判断完毕后是没有输出的,真假结果需要单独用echo来显示)
[ ][ -e ./file1 ]; echo $? (注意:括号两边都必须要有空格;不支持正则)
[[ ]][[ -e ./file1 ]]; echo $? (注意:括号两边都必须要有空格,此表达式中支持正则)

特别说明:

  1. [两边一定要有空格,没空格我就报错给你看 ]
  2. [[两边一定要有空格,没空格我就报错给你看 ]]
  3. 想查看更多判断;可以在命令行中使用man test命令查看各种判断示例;man test部分判断示例展示 image.png

二:条件判断相关参数

问:你要判断什么? 答:我要判断文件类型、判断文件新旧、判断字符串是否相等、判断权限等

1.判断文件类型和文件权限

判断参数有:-e  -f  -d  -L  -b  -S  -c  -p  -s -x -w -r -u -g -k
面试题1:说出上述各判断参数分别代表什么意思?

判断参数含义
-e判断文件是否存在(任意类型文件、这个文件可以是目录)
-f判断文件是否存在并且是一个普通文件
-d判断文件是否存在并且是一个目录
-L判断文件是否存在并且是一个软链接文件
-b判断文件是否存在并且是一个块设备文件
-S(大写)判断文件是否存在并且是一个套接字文件
-c判断文件是否存在并且是一个字符设备文件
-p判断文件是否存在并且是一个命名管道文件
-s(小写)判断文件是否存在并且文件大小大于零
-x判断文件是否存在并且文件具有可执行权限(u/g/o任意拥有者具有文件执行权限即为真)
-w判断文件是否存在并且文件具有可写权限(当前用户具有文件写入权限即为真)
-r判断文件是否存在并且文件具有可读权限(当前用户具有文件读取权限即为真)
-u判断文件是否存在并且文件用户ID位已设置(冒险位u+s:一个命令,给与用户s权限,则此用户暂时获得这个命令的属主权限(例chmod u+s /usr/bin/touch或者chmod 4755 /usr/bin/touch))
-g判断文件是否存在并且文件具有设置为组ID(强制位g+s:锁定一个文件或目录归属某组(例chmod g+s -R /test/或者chmod 2755 /test/)后续test下创建的文件或目录的所属组都跟随test这个文件夹)
-k判断文件是否存在并且是否设置了粘滞位(粘滞位o+t:一般用于公共文件夹的操作,给了t权限,其他用户就不能随意删除你的文件(例chmod o+t /test/或者chmod 1755 /test/)不同用户在test文件夹创的文件别的用户不能随意删除)

上述判断取反只需要在判断中加 !
示例:判断当前目录下是否不存在dir1目录;若不存在,则创建一个dir1目录;
[ ! -e ./dir1 ];mkdir dir1

image.png

2:判断文件新旧

说明:新旧指的是文件的修改时间
判断参数有:-nt -ot -ef
面试题2:说出上述各判断参数分别代表什么意思?
记忆助手:参数nt中表示new than(新);ot表示old than(老);ef中ef表示equal

判断参数含义
file1 -nt file2file1是否比file2新
file1 -ot file2file1是否比file2旧
file1 -et file2file1是否file2为同一文件(注意:两文件内容一样,不代表两个是同一个文件);或者用于判断硬链接,file1和file2是否指向同一inode

3:整数判断

判断参数有:-eq -ne -gt -lt -ge -le
面试题3:说出上述各判断参数分别代表什么意思?

判断参数含义
-eq等于(Equal)
-ne不等于(Not equal)
-gt大于(Greater Than)
-lt小于(Less than)
ge大于等于(Greater equal)
le小于等于(Less equal)

3.1类C风格的数字比较判断(特例:只有整数判断可以使用)

注意:类C风格判断格式只能用于数字判断,不可用于字符串、文件等判断 类C风格语法格式

语法格式示例
(( ))((1==2));echo $?
(( 1 > 0 ))类C风格中:括号两边可以没有空格;判断符号两边也可以没有空格
(( 1>=0 ))类C风格中:括号两边可以没有空格;判断符号两边也可以没有空格
((1<2))类C风格中:括号两边可以没有空格;判断符号两边也可以没有空格
(( 1<=0 ))类C风格中:括号两边可以没有空格;判断符号两边也可以没有空格

另外:在类C风格判断语句中 = 表示赋值;==表示判断是否相等(跟字符串判断不一样)

4:字符串判断

判断参数有:-z -n = !=
面试题3:说出上述各判断参数分别代表什么意思?

判断参数含义
-z判断是否为空字符串;字符串长度为0则成立(the length of string is zero)
-n判断是否为非空字符串;字符串长度不为0则成立(the length of string is nonzero)
string1 = string2判断字符串是否相等(注意:等号两边一定都要有空格,两边都没有空格会将整个判断视为一个字符串,值永远为真
string1 != string1判断字符串是否不相等(注意:判断符号两边一定都要有空格,两边都没有空格会将整个判断视为一个字符串,值永远为真

5:多重条件判断

判断参数有:-a && -o ||
面试题3:说出上述各判断参数分别代表什么意思?-a和&&使用上有什么区别

判断参数含义举例
-a 和 &&逻辑与[ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ] && [ 1 -ne 0 ] (注意:[]判断语句结构中-a符号是在一个判断语句中使用;&&是在两个判断语句中使用;) [[ 1 -eq 1 && 1 -ne 0 ]] (注意:[[ ]] 判断语法不支持 -a 和 -o)
-o 和逻辑或[ 1 -eq 1 -o 1 -ne 0 ] [ 1 -eq 1 ] || [ 1 -ne 0 ] (注意:[]判断语句结构中-a符号是在一个判断语句中使用;&&是在两个判断语句中使用) [[ 1 -eq 1 || 1 -ne 0 ]] (注意:[[ ]] 判断语法不支持 -a 和 -o)

示例: 1658051675(1).png

6:[ ]与 [[ ]]的区别

注意:[ ]与 [[ ]] 括号两边一定要有空格,没有空格一定报错

  1. [ ]中可以使用-a && 和-o ||表示逻辑与和逻辑或,[[ ]]判断**只能使用&&和||**来表示
    1658054227(1).png
  2. ==比较符在[[ ]]中是模式匹配,允许使用通配符,而在[ ]中仅仅用于精确比较 image.png
  3. =~比较符在[[ ]]中是正则匹配,在[ ]中不支持
    image.png
  4. [ ]中如果变量没有定义,那么需用双引号引起来,[[ ]]中不需要 image.png