shell:条件测试

()复合指令
[]文件测试 -eq形式数字比较
{}复合指令
(())数字比较自增资减
[[]]文件测试字符串比较
{{}}
$()命令
$[]整数计算 需要变量接收
${}变量
``命令

条件测试的基本语法

  • 条件为真,整个条件测试的返回值为0
  • 条件为假,测试语句的返回值为非0值
条件测试语法说明
test 条件表达式test命令和“<测试表达式>”之间至少有一个空格
[ 条件表达式 ]test命令的用法相同,的边界和内容之间至少有一个空格
[[ 条件表达式 ]]这是通过[[]]进行条件测试表达式的方法,是比test和[]更新的语法格式。[[]]的边界和内容之间至少有一个空格。
((条件表达式))一般用于if语句里。(())两端不需要有空格
  • [ ]的左右必须有一个空格

文件测试运算符

  • [ -e /root ]
  • [[ -e /root ]]
操作符说明举例
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-S是否为socket文件
-p是否为管道符文件
-L是否为链接文件
-u是否有suid的权限
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了冒险位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
f1 -nt f2文件f1比文件f2新则为真,根据文档修改时间来计算
f1 -ot -f2文件f1比文件f2旧则为真,根据文档修改时间来计算

示例:

//普通文件测试
[root@localhost ~]# [ -f file1.txt ] && echo yes || echo no
yes

//目录测试
[root@localhost ~]# [ -d /tmp ] && echo yes || echo no
yes

//测试文件属性
[root@localhost ~]# ll file1.txt 
-rw-r--r-- 1 root root 0 828 12:30 file1.txt
[root@localhost ~]# [ -r file1.txt ] && echo yes || echo no
yes
[root@localhost ~]# [ -x file1.txt ] && echo yes || echo no
no

字符串运算符

  • [[ “a” == “a” ]]
常用字符串测试操作符说明
-n “字符串”若字符串的长度不为0,则为真
-z “字符串”若字符串的长度为0,则为真
" 串1 " = ” 串2 “字符串1等于字符串2,则为真
" 串1 " != ” 串2 “若字符串1不等于字符串2,则为真
//-n如果字符串长度不为零输出yes,否则输出no
[root@localhost ~]# [ -n "hello" ] && echo yes || echo no
yes
[root@localhost ~]# [ -n "" ] && echo yes || echo no
no

//-z如果字符串长度为零输出yes,否则输出no
[root@localhost ~]# [ -z "hello" ] && echo yes || echo no
no
[root@localhost ~]# [ -z "" ] && echo yes || echo n
yes

// 字符串相等比较
注意:=的左右有空格,没有空格将会导致逻辑错误。
[root@localhost ~]# [ "HELO" = "hello" ] && echo yes || echo no
no
[root@localhost ~]# [ "HELO" != "hello" ] && echo yes || echo no
yes

if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi
if [ $a ]     -------$判断z字符串是否为空,不空为真,空为假
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi

关系运算符

  • ((2==2))
在[]以及test中使用的比较符号在(())和[[]]中使用的比较符号说明
-eq== 或 =相等
-ne!=不等
-gt>大于
-ge>=大于等于
-lt<小于
-le<=小于等于
两者都可以不能用-eq
数字比较test [] [[]](())
字符比较[[]]test [] (())
[root@localhost ~]# [ 5 -gt 3 ] && echo yes || echo no
yes

[root@localhost ~]# [ `id -u` -eq 0 ] && echo admin || echo other
admin

[root@localhost ~]# su - student
[student@localhost ~]$ [ `id -u` -eq 0 ] && echo admin || echo other
other

扩展:判断变量是不是数字

[root@localhost ~]# num10=123
[root@localhost ~]# num20=ssss1114ss
[root@localhost ~]# [[ "$num10" =~ ^[0-9]+$ ]];echo $?
0
[root@localhost ~]# [[ "$num20" =~ ^[0-9]+$ ]];echo $?
1

[root@localhost ~]# num10=123a
[root@localhost ~]# $[ num10+1 ]
[root@localhost ~]# echo $?
[root@localhost ~]# 1

变量的运算

1、算数运算符
算术运算符号意义
+-加号、减号
*/%乘法、除法、取余
**幂运算
~、`&^`
++- -自增和自减,可以放在变量的前面也可以放在变量的后面
=+=-=*=/=%=赋值运算符,例如 a+=1 相当于 a=a+1,a-=1 相当于 a=a-1
!&&、`
<<=>>=比较符号(小于、小于等于、大于、大于等于)
==!==比较符号(相等、不相等;对于字符串,= 也可以表示相当于)
<<>>向左移位、向右移位
2、算数运算命令
运算操作符/运算命令说明
$(( ))用于整数运算,效率很高,推荐使用。
let用于整数运算,和 $(()) 类似。
$[]用于整数运算,不如 $(()) 灵活。
bcLinux下的一个计算器程序,可以处理整数 和小数。
expr可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用。
declare -i将变量定义为整数,然后再进行数学运算时就不会被当做字符串了。仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减等
awk既可以用于整数运算,也可以用于小数运算
[root@bogon ~]# echo $((3 + 3))

[root@bogon ~]# c=$((3 + 3))

[root@bogon ~]# echo $[3 + 3]

[root@bogon ~]# let 3+5

[root@bogon ~]# bc
3+5

[root@bogon ~]# echo 3+5 |bc

[root@bogon ~]# declare -i r=3+4

逻辑操作符/布尔运算符

运算符布尔符说明举例
&&-a逻辑的 AND[[ $a -lt 100 && $​b -gt 100 ]] 返回 false
||-o逻辑的 OR`[[ $a -lt 100
!not,非,两端相反,则结果为真

示例:

[root@localhost ~]# [ -f /etc/hosts -a -f /etc/services ] && echo yes || echo no
yes

[root@localhost ~]# [[ -f /etc/hosts && -f /etc/services ]] && echo yes || echo no
yes
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值