本文目标:
了解shell条件判断语句有哪些判断语法:test [ ] [[ ]]
了解shell条件判断语句有哪些判断:如整数大小判断、字符串判断、文件是否存在判断等
一:条件判断语法格式
思考:shell中什么为真?什么是假?
在shell条件判断中0为真,非0为假
shell中3种条件判断语法结构
| 格式 | 示例(判断当前目录下file1文件是否存在) |
|---|---|
| test条件表达式 | test -e ./file1; echo $? (注意:条件判断完毕后是没有输出的,真假结果需要单独用echo来显示) |
| [ ] | [ -e ./file1 ]; echo $? (注意:括号两边都必须要有空格;不支持正则) |
| [[ ]] | [[ -e ./file1 ]]; echo $? (注意:括号两边都必须要有空格,此表达式中支持正则) |
特别说明:
- [ 我两边一定要有空格,没空格我就报错给你看 ]
- [[ 我两边一定要有空格,没空格我就报错给你看 ]]
- 想查看更多判断;可以在命令行中使用man test命令查看各种判断示例;man test部分判断示例展示
二:条件判断相关参数
问:你要判断什么? 答:我要判断文件类型、判断文件新旧、判断字符串是否相等、判断权限等
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
2:判断文件新旧
说明:新旧指的是文件的修改时间
判断参数有:-nt -ot -ef
面试题2:说出上述各判断参数分别代表什么意思?
记忆助手:参数nt中表示new than(新);ot表示old than(老);ef中ef表示equal
| 判断参数 | 含义 |
|---|---|
| file1 -nt file2 | file1是否比file2新 |
| file1 -ot file2 | file1是否比file2旧 |
| file1 -et file2 | file1是否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) |
示例:
6:[ ]与 [[ ]]的区别
注意:[ ]与 [[ ]] 括号两边一定要有空格,没有空格一定报错
- [ ]中可以使用-a && 和-o ||表示逻辑与和逻辑或,[[ ]]内判断**只能使用&&和||**来表示
- ==比较符在[[ ]]中是模式匹配,允许使用通配符,而在[ ]中仅仅用于精确比较
- =~比较符在[[ ]]中是正则匹配,在[ ]中不支持
- [ ]中如果变量没有定义,那么需用双引号引起来,[[ ]]中不需要