[ linux-004 ] if的常见用法(2)

176 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

在上一节基础上,讲解if语句和参数的其它用法

if参数含义

-d 判断制定的是否为目录

-z 判断制定的变量是否存在值

-f 判断制定的是否为文件

-L 判断制定的是否为符号链接

-r 判断制定的是否可读

-s 判断存在的对象长度是否为0

-w 判断制定的是否可写

-x 判断存在的对象是否可以执行

! 测试条件的否定符号

-e 文件存在

-a 文件存在(已被弃用)

-f 被测文件是一个regular文件(正常文件,非目录或设备)

-s 文件长度不为0

-d 被测对象是目录

-b 被测对象是块设备

-c 被测对象是字符设备

-p 被测对象是管道

-h 被测文件是符号连接 ln -s

-L 被测文件是符号连接

-S(大写) 被测文件是一个socket

-t 关联到一个终端设备的文件描述符。用来检测脚本的stdin[-t0]或[-t1]是一个终端

-r 文件具有读权限,针对运行脚本的用户

-w 文件具有写权限,针对运行脚本的用户

-x 文件具有执行权限,针对运行脚本的用户

-u set-user-id(suid)标志到文件,即普通用户可以使用的root权限文件,通过chmod +s file实现

-k 设置粘贴位

-O 运行脚本的用户是文件的所有者

-G 文件的group-id和运行脚本的用户相同

-N 从文件最后被阅读到现在,是否被修改

f1 -nt f2 文件f1是否比f2新

f1 -ot f2 文件f1是否比f2旧

f1 -ef f2 文件f1和f2是否硬连接到同一个文件

二元比较操作符,比较变量或比较数字

Shell 里面比较字符写法


-eq 等于

-ne 不等于

-gt 大于

-lt 小于

-le 小于等于

-ge 大于等于

-z 空串

= 两个字符相等

!= 两个字符不等

-n 非空串

整数比较:

-eq 等于 if [ "$a" -eq "$b" ]

-ne 不等于 if [ "$a" -ne "$b" ]

-gt 大于 if [ "$a" -gt "$b" ]

-ge 大于等于 if [ "$a" -ge "$b" ]

-lt 小于 if [ "$a" -lt "$b" ]

-le 小于等于 if [ "$a" -le "$b" ]

< 小于(需要双括号) (( "$a" < "$b" ))

<= 小于等于(...) (( "$a" <= "$b" ))

> 大于(...) (( "$a" > "$b" ))

>= 大于等于(...) (( "$a" >= "$b" ))

字符串比较:

= 等于 if [ "$a" = "$b" ]

== 与=等价

!= 不等于 if [ "$a" = "$b" ]

< 小于,在ASCII字母中的顺序:

if [[ "$a" < "$b" ]]

if [ "$a" \< "$b" ] #需要对<进行转义

> 大于

-z 字符串为null,即长度为0

-n 字符串不为null,即长度不为0

总结

if是shell脚本基本上百分百会用到的东西,而其使用方法很多,千万不要将逻辑弄混,有时一个符号,一个变量的判断,也会造成严重的后果。例如在删除文件夹时,如果整个变量为空,而未做非空判断,处理不当可能会将整个系统给直接干掉,引发生成事故。所以if语句我们需要学好,对各种参数的搭配,能够灵活应用。