深入浅出Linux-Shell编程[二】

举报
Maynor学长 发表于 2022/09/20 19:39:47 2022/09/20
【摘要】 ​2、Shell 测试表达式用法1、文件测试表达式-d 文件文件存在且为目录则为真-f 文件文件存在且为普通文件则为真-e 文件文件存在则为真,  不辩别是目录还是文件-s 文件文件存在且文件大小不为0则为真-r 文件文件存在且可读则为真,  与执行脚本的用户权限也有关-w 文件文件存在且可写则为真,  与执行脚本的用户权限也有关-x 文件文件存在且可执行则为真,  与执行脚本的用户权限也有...

​


2、Shell 测试表达式用法

1、文件测试表达式








-d 文件

文件存在且为目录则为真

-f 文件

文件存在且为普通文件则为真

-e 文件

文件存在则为真,  不辩别是目录还是文件

-s 文件

文件存在且文件大小不为0则为真

-r 文件

文件存在且可读则为真,  与执行脚本的用户权限也有关

-w 文件

文件存在且可写则为真,  与执行脚本的用户权限也有关

-x 文件

文件存在且可执行则为真,  与执行脚本的用户权限也有关

-L 文件

文件存在且为链接文件则为真

f1 -nt f2

文件f1比文件f2新则为真,  根据文件的修改时间计算

f1 -ot f2

文件f1比文件f2旧则为真,  根据文件的修改时间计算

  文件测试 [ 操作符 文件或目录 ]

[root@qfedu.com	~]# test ‐d /home
[root@qfedu.com	~]# echo $?
0	
[root@qfedu.com	~]# test ‐d /home11111
[root@qfedu.com	~]# echo $?
1	
[root@qfedu.com	~]# [ ‐d /home ]
[root@qfedu.com	~]# [ ! ‐d /ccc ]  && mkdir /ccc
[root@qfedu.com	~]# [ ‐d /ccc ]  | | mkdir /ccc






2、字符串测试表达式

# 提示:  字符串必须使用双引号
[root@qfedu.com  ~]# [ "$USER" = "root" ];echo $?
0
[root@qfedu.com  ~]# [ "$USER" == "root" ];echo $?
0
[root@qfedu.com  ~]# BBB=""
[root@qfedu.com  ~]# echo ${#BBB}
0
[root@qfedu.com  ~]# [ ‐z "$BBB" ]
[root@qfedu.com  ~]# echo $?
0
[root@qfedu.com  ~]# [ ‐n "$BBB" ]
[root@qfedu.com  ~]# echo $?
1
[root@qfedu.com  ~]# var2=
[root@qfedu.com  ~]#
[root@qfedu.com  ~]# echo ${#var1}
3
[root@qfedu.com  ~]# echo ${#var2}
0
[root@qfedu.com  ~]# echo ${#var3}
0
[root@qfedu.com  ~]# [ ‐z "$var1" ];echo $?
1
[root@qfedu.com  ~]# [ ‐z "$var2" ];echo $?
0
[root@qfedu.com  ~]# [ ‐z "$var3" ];echo $?
0
[root@qfedu.com  ~]# [ ‐n "$var1" ];echo $?
0
[root@qfedu.com  ~]# [ ‐n "$var2" ];echo $?






参数

功能

-z

1

如果字符串s1的长度为0,  则测试条件为真

-n

1

如果字符串s1的长度大于0,  则测试条件为真

sl


如果字符串s1不是空字符串,  则测试条件为真

=或==

s1=s2

如果s1等于s2,  则测试条件为真,“=”前后应有空格

!=

s1!=s2

如果s1不等于s2,  则测试条件为真

<

1

如果按字典顺序s1在s2之前,  则测试条件为真

>

s1>s2

如果按自定顺序s1在s2之后,  则测试条件为真




1、注意

  对于字符串的比较,  一定要将字符串加比引号后再比较。如[ -n "$string" ]

   =与!=可用于判断两个字符串是否相同

2、字符串比较

# 提示:  字符串必须使用双引号
[root@qfedu.com  ~]# [ "$USER" = "root" ];echo $?
0
[root@qfedu.com  ~]# [ "$USER" == "root" ];echo $?
0

[root@qfedu.com  ~]# BBB=""
[root@qfedu.com  ~]# echo ${#BBB}
0
[root@qfedu.com  ~]# [ ‐z "$BBB" ]
[root@qfedu.com  ~]# echo $?
0
[root@qfedu.com  ~]# [ ‐n "$BBB" ]
[root@qfedu.com  ~]# echo $?
1
[root@qfedu.com  ~]# var2=
[root@qfedu.com  ~]#
[root@qfedu.com  ~]# echo ${#var1}
3
[root@qfedu.com  ~]# echo ${#var2}
0
[root@qfedu.com  ~]# echo ${#var3}
0
[root@qfedu.com  ~]# [ ‐z "$var1" ];echo $?
1
[root@qfedu.com  ~]# [ ‐z "$var2" ];echo $?
0
[root@qfedu.com  ~]# [ ‐z "$var3" ];echo $?
0
[root@qfedu.com  ~]# [ ‐n "$var1" ];echo $?
0
[root@qfedu.com  ~]# [ ‐n "$var2" ];echo $?














3、整数操作符






在[]和test中使用

在[[ ]]和(( ))中使用

说明

-eq

==或=

等于,  全拼为equal

-nq

!=

不等于,  全拼为not equal

-gt

>

大于,  全拼为greater than

-ge

>=

大于等于,  全拼为greater equal

-lt

<

小于,  全拼为less than

-le

<=

小于等于,  全拼为less equal




1、判断变量是不是数字





[root@qfedu.com  ~]# num10=123

[root@qfedu.com  ~]# num20=ssss1114ss

[root@qfedu.com  ~]# [[ "$num10" =~ ^[0 ‐9]+$ ]];echo $?

0

[root@qfedu.com  ~]# [[ "$num20" =~ ^[0 ‐9]+$ ]];echo $?

1

[root@qfedu.com  ~]# disk_use=$(df ‐P |grep '/$ ' |awk '{print $5} ' |awk ‐F% '{print $1} ') [root@qfedu.com  ~]# [ $disk_use ‐gt 90 ] && echo "war......"

[root@qfedu.com  ~]# [ $disk_use ‐gt 60 ] && echo "war......"

war......


[root@qfedu.com  ~]# id ‐u

0

[root@qfedu.com  ~]# [ $(id ‐u) ‐eq 0 ] && echo "当前是超级用户"

当前是超级用户

[alice@qfedu.com  ~]$ [ $UID ‐eq 0 ] && echo "当前是超级用户" | | echo "you不是超级用户" you不是超级用户



3、C语言风格的数值比较





[root@qfedu.com  ~]# ((1<2));echo $?

0

[root@qfedu.com  ~]# ((1==2));echo $?

1

[root@qfedu.com  ~]# ((1>2));echo $?

1

[root@qfedu.com  ~]# ((1>=2));echo $?

1

[root@qfedu.com  ~]# ((1<=2));echo $?

0

[root@qfedu.com  ~]# ((1!=2));echo $?

0

[root@qfedu.com  ~]# ((`id ‐u`>0));echo $?

1

[root@qfedu.com  ~]# (($UID==0));echo $?

0



4、实例

# 案例1:
[root@qfedu.com  ~]# cat test02.sh #!/bin/bash
# 判断用户输入的是否是数字
read ‐p "请输入一个数值: " num
if [[ ! "$num" =~ ^[0 ‐9]+$ ]];then    echo "你输入的不是数字,  程序退出!!!"
exit
fi

echo ccc
# 案例2:
[root@qfedu.com  ~]# cat test03.sh # !/bin/bash
while :
do
if [[ $num =~ ^[0 ‐9]+$ ]];then
break
else
read ‐p "不是数字,  请重新输入数值: " num fi
done
echo "你输入的数字是: $num"










4、逻辑操作符






在[]和test中使用

在[[ ]]和(( ))中使用

说明

-a

&&

and,  与,  两端都为真,  则结果为真

-o

| |

or,  或,  两端有一个为真,  则结果为真

!

!

not,  非,  两端相反,  则结果为真



[root@qfedu.com  ~]# [ 1 ‐lt 2 ‐a 5 ‐gt 10 ];echo $?

1

[root@qfedu.com  ~]# [ 1 ‐lt 2  ‐o 5 ‐gt 10 ];echo $?

0


[root@qfedu.com  ~]# [[ 1 ‐lt 2 && 5 ‐gt 10 ]];echo $?

1

[root@qfedu.com  ~]# [[ 1 ‐lt 2 | | 5 ‐gt 10 ]];echo $?

0



5、测试表达式的区别总结






测试表达

式符号

test

[ ]

[[ ]]

(( ))

边界是否

需要空格

需要

需要

需要

不需要

逻辑操作

符

!、-a、   -o

!、-a、   -o

!、&&、   | |

!、&&、   | |

整数比较

操作符

-eq、-ne、-lt、- gt、-ge、-le

-eq、-ne、-lt、- gt、-ge、-le

-eq、-ne、-lt、-gt、-ge、-le或 =、!=、<、>、>=、<=

=、!=、<、

>、>=、<=

字符串比

较操作符

=、==、!=

=、==、!=

=、==、!=

=、==、!=

是否支持

通配符

不支持

不支持

支持

不支持






​

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。