shell学习之路--条件判断

本文详细介绍了Shell脚本中的条件测试结构,包括if/then, if/then/else, if/elif/else,以及不同类型的比较操作,如文件测试、整数比较和字符串比较。此外,还讲解了文件测试符的使用,如-e, -f, -d等,以及整数比较操作符,如-eq, -ne, -gt等。文章通过实例分析展示了如何在脚本中进行复杂的条件判断和比较操作。
摘要由CSDN通过智能技术生成

目录

一、条件测试结构

二、 实例分析

三、文件测试与整数比较

 四、组合比较与测试


一、条件测试结构

1.if/then结构支持以下形式:

 If…fi

 If…else…fi

 If…elif…else…fi

2.if/then结构判断命令列表的退出状态码是否为0

2.1 if grep -q Bash file1 查看

2.2 if echo “Linux”  | grep -q “$inu”

2.3 if test -z “$1”

2.4 if /usr/bin/test -z “$1”

2.5 id [ -z “$1” ] ([ 是个命令 ] 是 [ 是一命令)

2.6 if [[ $conditionl || $conditionl@ ]]

[root@server1 ~]# rpm -qf /usr/bin/test

coreutils-8.22-21.el7.x86_64

[root@server1 ~]# rpm -qf /usr/bin/[

coreutils-8.22-21.el7.x86_64

[root@server1 ~]# v1=1

[root@server1 ~]# v2=2

[root@server1 ~]# [ "$v1" -ne "$v2" ] && echo "Not equal" (-ne 不等于)

Not equal

二、 实例分析

1.条件测试结构   Test Construects

1.1 fi test condition -true 与 if [ condition-true ] 相同

if [ condition-true ]

then

  command 1

  command 2

  …

else

  command 1

  command 2

  …

fi

if [ -x “$filename” ] ; then

if : ; then echo “ok”; fi

1.2 [ … ]对格式有严格要求:

 1.2.1 [ ]中每个组件都需要用空格符分隔

 1.2.2 [ ]中的变量和常量最好都用双引号引起来

1.3 [[…]]结构比[…]结构更加通用

1.4 命令true至此的类型:

 1.4.1 数值比较

 1.4.2 字符串比较

 1.4.3 文件比较

#!/bin/bash
# if命令还可以对命令进行测试,并是仅仅是中括号中的条件

#比较两个文件是否一样
date >testfile1.txt
date >testfile2.txe
if cmp testfile1.txt testfile2.txt &> /dev/null #抑制输出
  then echo "Flies are indetical"
  else echo "Flies are differ"
fi
#在grep中,很有用
if grep -q CST testfile1.txt
  then echo "File contains at lease one occrence of CST"
fi
#复杂一些的
word=Linux
letter_swquence=inu
if echo "$word" | grep -q "$letter_sequence"
then
 echo "$lteter_sequence found in $word"
else
 echo "$lteter_sequence not  found in $word"
fi
rm testfile[12].txt
exit 0

#!/bin/bash
# 0是真
echo "Ttesting \"0\""
if [ 0 ]
then
  echo "0 is ture"
else
  echo "0 is false"
fi
echo 

# 1是真 !!!
echo "Testing \"1\""
if [ 1 ]
then
 echo "1 is ture"
else
 echo "1 is false"
fi
echo 

# -1是真!!!
echo "Testing \"-1\""
if [ -1 ]
then
 echo "-1 is ture"
else
 echo "-1 is false"
fi
echo 

# NULL是假
echo "Testing \"NULL\""
if [ ] # NULL 空状态
then
  echo "NULL is ture"
else
  echo "NULL is false"
fi
echo 
#随意字符是真
echo "Testing \"sxz\""
if [ sxz ]
then
 echo "Radom string is ture"
else
 echo "Radom string is false"
fi
echo 
# 未初始化的变量是假
echo "Testing \"\$UninitVar\""
if [ $UninitVar ]
# if [ -n $UninitVar ] #这样更加规范的写法
then
 echo "UninitVar variable is ture"
else
 echo "UninitVar variable is false"
fi
echo

三、文件测试与整数比较

1.文件测试符  File test operators

-e

文件存在

-a

与-e相同,已被“弃用”了

-f

表示是一个普通文件(并不是目录或者设备文件)

-s

文件大小不为零

-d

表示这是一个目录

-b

表示这是一个块设备(软盘,光驱等)

-c

表示这是一个字符设备(键盘,声卡等)

-p

这个文件是个管道

-h

这是一个符号链接

-L

这是一个符号链接

-s

表示这是一个socket

-t

文件(描述符)被关联到一个终端设备上

-r

当前用户是否具有可读权限

-w

当前用户是否具有可写权限

-x

当前用户是否具有可执行权限

-g

Set-group-id(sgid)标记被设置到文件或目录上

-u

Set-user-id(suid)标记被设置到文件上

-k

设置粘贴位

-o

当前用户是否是文件的用有者

-G

文件的group-id是否与当前用户

-N

从上一次被读取到现在为止,文件是否被修改过

f1 -nt f2

文件f1比文件f2新

  f1 -ot f2

文件f1比文件f2旧

f1 -ef f2

文件f1比文件f2是相同的硬链接

#!/bin/bash
# 检查文件是否存在
echo -e "Enter the name of the file  : \c"
read file_name
if [ ! -f $file_name ]
then
 :
else
 echo "$file_name not exists"
fi
exit 0

 

 2.整数比较操作符  Integer Comparison

2.1 在中括号中使用 square bracket

-eq

equal

等于

if [ “$a” -eq “$b” ]

-ne

not equal

不等于

if [ “$a” -ne “$b” ]

-gt

greater than

大于

if [ “$a” -gt “$b” ]

-ge

greater  then or equal

大于等于

if [ “$a” -ge “$b” ]

-lt

less  then

下于

if [ “$a” -lt “$b” ]

-le

less than or equal

下于等于

if [ “$a” -le “$b” ]

2.2 在双圆括号中使用 Double-Parenthess

<

下于

if ((“$a” < “$b” ))

<=

下于等于

if ((“$a” < = “$b” ))

>

大于

if ((“$a”  > “$b” ))

>=

大于等于

if ((“$a” >= “$b” ))

3.字符串比较符  String Comparion

操作符

含义

示例

备注

=

等于

if [ “$a” = “$b” ]

==

等于

if [ “$a” == “$b” ]

与=等价

!=

不等于

if [ “$a” != “$b” ]

<

小于

if [ “$a” < “$b” ]

if [“$a” \< “$b”

在[ ]结构中的,需要被转义

>

大于

if [ “$a” >“$b” ]

if [ “$a” /> “$b” ]

在[ ]结构中的,需要被转义

-z

长度为零

if [ -z “$a” ]

字符串长度为零

-n

长度不为零

if [ -n “$a” ]

str

非空

if [ $a]

检查字符串str是否非空字符串

注:1.<和>,按照ASCII字进行排序

    2.建议把字符串用双引号引用起来

#!/bin/bash
a=4
b=5
if [ "$a" -ne "$b" ]
then
  echo "$a is not equal to $b"
  echo "(arithmetic comparison)"
fi
echo 

if [ "$a" != "$b" ]
then
  echo [ "$a is not equal to $b" ]
  echo "(string comparison)"
fi

#!/bin/bash
# 编程时,强烈建议对字符串引用起来!
# 本脚本进行验证
# 例1:-n 对未声明的变量,采用引用
if [ -n "$string1" ]
then
  echo "$string1 \"string1\" is not null "
else
  echo "$string1 \"string1\" is null "
fi
# 会输出:string1 "string1" is null 
echo 
#例2:-n对未声明的变量,没有引用
if [ -n $string2 ]
then
  echo "$string2 \"string2\" is not null "
else
  echo "$string2 \"string2\" is null "
fi
# 会输出:string1 "string1" is not  null  
echo 
#例3:-n 变量引用,对未声明的变量,采用引用
if [ "$string3" ]
then
  echo "$string \"string3\" is not null "
else
  echo "$string \"string3\" is null "
fi
# 会输出:string "string3" is null 
echo 
#例4:-n 变量引用,对为声明的变量,没有引用
if [ $string4 ]
then
  echo "$string \"string4\" is not null "
else
  echo "$string \"string4\" is null "
fi
# 会输出:string4 "string4"  is   null 
echo 
#例5:变量引用,已声明并赋值的变量,采用引用
string5=Initialized
if [ "$string5" ]
then
  echo "$string \"string5\" is not null "
else
  echo "$string \"string5\" is null "
fi
# 会输出:string "string5" is not  null 
echo 
#例6:变量引用,已声明并赋值的变量,不采用引用
string6=Initialized
if [ "$string6" ]
then
  echo "$string \"string6\" is not null "
else
  echo "$string \"string6\" is null "
fi
# 会输出:string "string6" is not  null 
echo 
#例7:一个特殊的字符串,如果不进行引用
string7="a = b"
if [ $string7 ]
then
  echo "$string \"string7\" is not null "
else
  echo "$string \"string7\" is null "
fi
# 会输出:string "string7" is   null 
echo 

exit 0

#!/bin/bash
# 使用more来查看gzip文件
# 定义错误退出代码
NOARGS=65
NOTFOUND=66
NOTGZIP=67
# 判断是否传递参数
if [ $# -eq 0 ]
then
  echo "Usage: `basename $0` filename " >&2
  exit $NOARGS
fi

filename=$1
if [ ! -f "$filename" ]
then
  echo "File $filename no found !" >&2
  exit $NOTFOUND
fi

# 检查文件 “扩展名”
# 其实,这不是最交的判断是否zip格式的方法
if [ ${filename##*.} != "gz" ]
then
 echo "File $1 is not a gzipped file !"
 exit $NOTZIP
fi

zcat $1 | more
exit 0

 Tip:文件名(testtext,txt.gz)是否是以.gz 结尾的?

方法1:

  从最右边开始,取3个字符,判断是否是.gz

方法2:

  参数替换

  $ {filename##*.}

  语法是:

  ${variable#pattern} 匹配最短

  ${variable##pattern} 匹配最长

 四、组合比较与测试

1.组合比较  Compound Comparison

1.1通过布尔操作符来比较

 1.1.1 -a 逻辑与

 [ expl -a pxp2 ]

1.1.2 -o 逻辑或

 [ exp1 -o exp2 ]

1.2通过比较操作符来组合比较

1.2.1 && 逻辑与

 [ exp1 && exp2 ]

1.2.2 || 逻辑或

 [ epx1 || exp2]

#!/bin/bash
a=24
b=47
# 1 而且 &&
if [ "$a" -eq 24 ] && [ "$b" -eq 47 ]
then
 echo "Test #1 succeeds."
else
 echo "Test #1 fails."
fi
#如果这样写,会出错
#if [ "$a" -eq 24 && “$b" -eq 47 ]
#如果这样写,没有问题
#if [[ "$a" -eq 24 && "$b" -eq 47 ]]
# 2 或者 ||
if [ "$a" -eq 88 ] || [ "$b" -eq 47 ]
then
 echo "Test #2 succeeds."
else
 echo "Test #2 fails."
fi
# 3 而且 -a 
if [ "$a" -eq 24 -a  "$b" -eq 47 ]
then
 echo "Test #3 succeeds."
else
 echo "Test #3 fails."
fi
# 4 或者 -o
if [ "$a" -eq 88 -o "$b" -eq 47 ]
then
 echo "Test #4 succeeds."
else
 echo "Test #4 fails."
fi
# 5 字符串比较,而且 &&
a=aaaa
b=bbbb
if [ "$a" = aaaa ] && [ "$b" = bbbb ]
then
 echo "Test #5 succeeds."
else
 echo "Test #5 fails."
fi

exit 0

 

2.嵌套的if条件测试  Nested if Confition Teste

if [ exp1 ]
then 
 if [ exp2 ]
 then 
  dosomething # 仅当exp1 和exp2均满足时
 fi
fi

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值