双括号(( ))
- 使用双括号,在比较过程中使用 **高级数学表达式 **
双方括号 [[] ]
使用 if 和 elif 中嵌套 else 结合使用,让脚本检查拥有目录的不存在用户以及没有拥有目录的不存在用户


elif 语句中,紧跟其后的 else 语句属于 elif 代码块,它们并不属于之前的 if-then 代码块 |

bash shell 的一种条件测试方法,无需在 if-then 语句中声明 test 命令
if [condition]
then
** commands**
fi
( 中括号中的比较的变量数值只能是整数,浮点数的比较将会出现错误 )
可以判断三类条件:
1、数值比较
2、字符串比较
3、文件比较
1、数值比较


2、字符串比较
比较 | 描述 |
str1 = str2 | 检查 str1 是否和 str2 相同 |
str1 != str2 | 检查 str1 是否和 str2 不同 |
str1 < str2 | 检查 str 1 是否比 str2 小 |
str1 > str2 | 检查 str1 是否比 str2 大 |
-n str1 | 检查 str1 的长度是否非 0 |
-z str1 | 检查 str1 的长度是否为 0 |
但是当你使用 < > 号时,就会出现一些不易察觉的问题


上面的脚本中只使用了 > 号,没有出现错误。但是脚本把 > 号解释成了输出重定向,因此它创建了一个名为 ZHJ 的文件,原因是由于比较返回了退出状态码 0,if 语句便以为所有命令都成功结束了。
要解决此问题只用将 > 正确转义即可

另外一个小问题就是 比较 大小写字母 与 sort 的区别 ,除非你经常处理大小写字母,否则几乎遇不到:
在比较测试中,大写字母被认为是小于小写字母的,但 sort 命令恰好相反。

3、文件比较
文件比较功能
比较
描述
-d file
检查 file 是否存在并是一个目录
-e file
检查 file 是否存在(可文件或目录)
-f file
检查 file 是否存在并是一个文件
-r file
检查 file 是否存在并可读
-s file
检查 file 是否存在并非空
-w file
检查 file 是否存在并可写
-x file
检查 file 是否存在并可执行
-O file
检查 file 是否存在并属当前用户所有
-G file
检查 file 是否存在并且默认组与当前用户相同
file1 -nt file2
检查 file1 是否比 file2 新
file1 -ot file2
检查 file1 是否比 file2 旧


比较两个文件日期:( 这里有个问题就是当比较的文件不存在时,测试将会返回一个错误的结果 )


所以比较文件时间时首先要确定文件是否存在,可以使用 -f 选项
复合条件测试:
if - then 允许使用布尔逻辑来组合测试,有两种布尔运算符可以使用:
** [condition1] && [ condtion2 ]**
** [condition2] || [ condition2 ]**




case variable in
pattern1 | pattern2) commands1 ;;
pattern3) commands2;;
*) default commands;;
esac
case variable in
pattern1 | pattern2) commands1 ;;
pattern3) commands2;;
*) default commands;;
esac
case 命令会将指定的变量与不同模式进行比较,如果变量和模式是匹配的,那么 shell 会执行为该模式指定的命令。可以通过竖线操作符在一行中分割出多个模式,星号会捕获所有与已知模式不匹配的值。

