1-23-条件测试语句和if流程控制语句的使用


时间:2018-06-16 姓名:魏文应


一、变量测试语句

test测试命令

使用test命令,可以进行变量的测试。如果结果是对的,也叫结果为真,用$?=0表示,反之为假,用$?=1表示。

参数 说明 示例
-e 文件名 文件是否存在,存在为真 test -e my_test.txt
-r 文件名 文件是否可读,可读为真 test -r my_test.txt
-w 文件名 文件是否可写,可写为真 test -w my_test.txt
-x 文件名 文件是否可执行,可执行为真 test -x my_test.txt
-s 文件名 文件是否有字符,有为真 test -s my_test.txt
-d 文件名 文件是否为目录,是为真 test -d my_test.txt
-f 文件名 文件是否为普通文件,是为真 test -f my_test.txt
-c 文件名 文件是否为字符型特殊文件,是为真 test -c my_test.txt
-b 文件名 文件是否为块特殊文件,是为真 test -b my_test.txt

注意:文件必须存在,不存在都为假,$?=1。 比如:

# 测试文件是否存在
test -e my_test.txt
# 打印测试结果
echo $?

数值大小比较

参数 说明
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于

比如:

# 判断5和4是否相等
test  5 -eq 4
# 打印测试结果
echo $?

字符串比较

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

比如:

str1=abc
str2=abcd

test $str1 = $str2
echo $?

test $str1 == $str2
echo $?

test $str1 != $str2
echo $?

test -z $str1
echo $?

test测试语句另一种常用的使用方法

我们使用 [ ] 中括号来表示test这个命令,比如 [ -d /etc ] 来判断 /etc 是否是一个目录,相当于 test -d /etc 这个命令。使用 [ ] 中括号,在数值比较时,我们可以使用正常的数学符号来比较数值大小,也可以使用 -eq、-ne、-gt 等字符。

字符表示 符号替代表示
-eq == 等于
-ne != 不等于
-gt > 大于
-lt < 小于

在使用 [ ] 替代test命令是,我们要注意一下几点:

  • 中括号开始和结束 需要带空格,比如:[ -d /etc ] 是正确的,[-d /etc] 是不正确的。
  • 比较符两边要加空格,比如:[ 9 == 4 ] 是正确的, [ 9==4 ] 是不正确的。
  • 大于号和小于号要加转义字符(\),比如: [ 9 \< 4 ] 是正确的,[ 9 < 4 ] 是不正确的。如果不用转义字符,可以这样使用:[[ 9 < 4 ]]

我们需要了解以下特性:

  • [ ]表达式中,常见的> 、<需要加转义字符,表示字符串大小比较。

  • [[ ]] 运算符只是 [ ]运算符的扩充, 能够支持< 、>符号运算,而不需要转义符。里面支持逻辑运算符 || 、 && 不再使用 -a 、-o 。

  • [[ ]] 能用正则,而 [ ] 不行,比如:

    # 这个打印false,*.html就是字面上的意思,而不是通配符*
    [ "a.html" == *.html ] && echo true || echo false
    
    # 这个打印ture,*是通配符
    [[ "a.html" == *.html ]] && echo true || echo false  
    
    # 用引号引起来,*也不是通配符,只是字面上的意思
    [[ "a.html" == "*.html" ]] && echo true || echo false
    

逻辑与(&&)和逻辑或(||)

逻辑与(&&): 逻辑与,可以用 -a 表示(在[[ ]] 这中有双中括号的时候,不能用 -a 表示 &&)。比如:[ -f /etc/passwd ] && [ -w /etc/passwd ]

逻辑或(||): 可以用 -o 表示(在[[ ]] 这中有双中括号的时候,不能用 -o 表示 ||)。比如:[ -f /etc/passwd ] || [ -w /etc/passwd ]

在条件判断中,使用逻辑与,可以使用下面三种写法:

if [ 条件判断一 ] && [ 条件判断二 ]; then
    命令一
fi
if [[ 条件判断一 && 条件判断二 ]]; then
    命令一
fi
if [ 条件判断一 -a 条件判断二 ]; then
    命令一
fi

逻辑与和逻辑或,还有下面的用途,比如

[ 1 -lt 2 -a 5 > 3 ] && echo true || echo false

上面语句,如果[ 1 -lt 2 -a 5 > 3 ]为真时,执行echo true,如果为假时,执行echo false

二、流程控制--if语句

单分支if语句

语法格式:

if  条件1  ; then
    命令1
fi

比如:

#!/bin/bash

if [ $USER != root ]
then
        echo "error: not root user, permission demain."
        exit 127            # 给它一个退出码
fi

也可以将then和if放在同一行:

#!/bin/bash

if [ $USER != root ]; then
        echo "error: not root user, permission demain."
        exit 127            # 给它一个退出码
fi

双分支if语句

语法格式:

if  条件1  ; then
    命令1
else
    命令2
fi

比如,写一个ping测试IP的脚本,看一下是否能够ping通:

#!/bin/bash

# 在类Unix系统中,/dev/null,或称空设备,
# 是一个特殊的设备文件,它丢弃一切写入其
# 中的数据(但报告写入操作成功),读取它
# 则会立即得到一个EOF。

ping -c 3 -i 0.2 $1 > /dev/null

if [ $? -eq 0 ]; then
        echo "HOST $1 is up"
else
        echo "HOST $1 is down"
fi

多分支if语句

语法格式:

if  条件1  ; then
    命令1
elif  条件2  ; then
    命令2:
elif  条件3  ; then
    命令3
else
    命令n
fi

比如:

#!/bin/bash

m=man
w=woman

read -p "请输入你的性别:" sex

if [ $sex == $m ]; then
        echo "这是男人。"
elif [ $sex == $w ]; then
        echo "这是女人。"
else
        echo "输入错误。"
fi

你可能感兴趣的:(1-23-条件测试语句和if流程控制语句的使用)