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是否相等 test5 -eq 4 # 打印测试结果 echo $?

字符串比较
参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
比如:
str1=abc str2=abcdtest $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/bashif [ $USER != root ] then echo "error: not root user, permission demain." exit 127# 给它一个退出码 fi

也可以将then和if放在同一行:
#!/bin/bashif [ $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/nullif [ $? -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

【1-23-条件测试语句和if流程控制语句的使用】比如:
#!/bin/bashm=man w=womanread -p "请输入你的性别:" sexif [ $sex == $m ]; then echo "这是男人。" elif [ $sex == $w ]; then echo "这是女人。" else echo "输入错误。" fi

    推荐阅读