shell脚本学习三(结构化命令、比较)

shell脚本学习三(结构化命令、比较)

Scroll Down

双括号(( ))

  • 使用双括号,在比较过程中使用 **高级数学表达式 **

双方括号 [[] ]

  • 提供了 **字符串比较 **的高级特性

使用 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 会执行为该模式指定的命令。可以通过竖线操作符在一行中分割出多个模式,星号会捕获所有与已知模式不匹配的值。