条件测试和判断语句
在shell 中,用户可以使用测试语句来测试指定的条件表达式的条件的真或者假。当指定的条件为真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。
条件测试的语法有两种,分别是test和[命令,下面分别来讲解它们的语法:
1)test
test 语法如下:
test expression
参数expression表示需要测试的条件表达式,可以由字符串、整数、文件名,以及各种运算符组成。
2)[
与 test 命令相同,[ 命令的作用也是对后面的条件表达式进行测试,但是为了增加程序的可读性,shell要求在表达式后面追加一个右方括号 ] 来与前面的 [ 命令配对。语法如下:
[ expression ]
[是命令,expression 是条件表达式。条件表达式和左右方括号之间都必须有一个空格。
左方括号 [ 是一个shell命令,而非条件表达式的一部分。
而命令与参数之间必须保留一个空格。
所以,在上面的语法中,expression与左右括号都需保留一个空格。
字符串测试
在shell中,可以通过5种运算符来对字符串进行操作。
字符串运算符
运算符 | 说明 |
---|---|
string | 判断指定的字符串是否为空 |
string1 = string2 | 判断两个字符串是否相等 |
string1 != string2 | 判断两个字符串是否不相等 |
-n string | 判断字符串是否非空串 |
-z string | 判断字符串是够为空串 |
对于字符串测试应该基本了解,但应注意以下两点:
- 在给变量赋值的时候,等号"="左右两边一定不要有空格;否则,shell会把空格前面的字符串当作shell命令
- 在测试运算符"="、"!="、及"-z"等符号的左右两边,一定含有空格
整数测试
整数测试的语法形式为:
[ number1 op number2 ]
运算符 | 说明 |
---|---|
number1 -eq number2 | 比较number1 和number2是否相等。如果相等,测试结果为0 |
number1 -ne number2 | 比较number1 和number2是否不相等。如果不相等,测试结果为0 |
number1 -gt number2 | 比较number1是否大于number2。如果大于,测试结果为0 |
number1 -lt number2 | 比较number1是否小于number2。如果小于,测试结果为0 |
number1 -ge number2 | 比较number1 是否大于等于number2。如果大于等于,测试结果为0 |
number1 -le number2 | 比较number1是否小于等于number2。如果小于等于,测试结果为0 |
字符串运算符和整数运算符不可以混用。
[root@VM_16_3_centos base]$ x=12.3
[root@VM_16_3_centos base]$ y=12
[root@VM_16_3_centos base]$ [ "$x" -gt "$y" ]
-bash: [: 12.3: integer expression expected
文件测试
[ op file ]
操 作 符 | 说明 |
---|---|
-a file | 文件是否存在。如果file存在,则结果为0 |
-b file | 文件是否存在,且为块文件。如果file是一个已经存在的块文件,则结果为0 |
-c file | 文件是否存在,且为字符文件。如果file是一个已经存在的字符文件,则结果为0 |
-d file | 文件是否存在,且为目录。如果file是一个已经存在的目录,则结果为0 |
-e file | 同-a操作符 |
-s file | 文件的长度是否大于0或者文件为非空文件。如果file是一个非空文件,则结果为0 |
-f file | 文件存在,且为常规文件。如果file是一个已经存在的常规文件,则结果为0 |
-w file | 文件是否存在且可写。如果文件按是一个可写文件则结果为0 |
−L file | 文件是否存在,且为符号链接。如果file是一个已经存在的符号链接,则结果为0 |
−u file | 文件是否设置suid位。如果file已经设置了suid位,则结果为0 |
−r file | 文件是否存在且可读。如果文件按是一个可读文件则结果为0 |
−x file | 文件是否存在且可执行。如果文件按是一个可执行文件则结果为0 |
逻辑操作符
操作符 | 说明 |
---|---|
!expression | 逻辑非,条件表达式expression的值为假,则该操作符的运算结果为真 |
expression1 -a expression2 | 逻辑与,条件表达式expression1和expression2的值都是真时,整个表达式的值才为真 |
expression1 −o expression2 | 逻辑或,条件表达式 expression1或者expression2的值有一个为真时,整个表达式的值就为真 |
条件判断语句
1.使用简单的if语句进行判断
if expression
then
statement
statement
fi
例4:通过条件测试判断某些文件的类型
#!/bin/bash
# 通过条件测试判断/bin/bash 文件是否存在
if [ -a /bin/bash ]
then
echo "/bin/bash exist!"
fi
结果为
[root@VM_16_3_centos if_test]$ sh if.sh
/bin/bash exist!
例5:使用空命令作为判断条件
#! /bin/bash
if :;
then
echo "always true";
fi
空命令":"的退出状态永远为0,因此会输出 always true。
例6:使用&&代替 if 语句进行判断
#! /bi/bash
test "$whoami" != "root" && (echo you are using a non-privileged account; exit 1)
该判断语句首先对当前用户进行判断,如果当前用户不为root,也即为真则输出后面的说明语句。
2.使用if else 语句进行流程控制
if expression
then
statement1
statement2
..
else
statement3
statement4
..
fi
3.使用if elif进行多条件判断
if expression
then
statement1
statement2
..
elif expression
then
statement3
statement4
..
else
statement5
..
fi
4.使用exit语句退出程序
exit status
status参数表示退出状态,该参数是一个整数值,其取值范围为0~255;
按照惯例,退出状态0意味着脚本成功运行完毕;而非0通常意味着程序执行过程中出现某些错误。
因此,用户可以用其它的非0值来给父进程传递不同的消息,根据子进程的成功或者失败,父进程采取不同的措施,如果没有参数给语句,那么由exit语句之前的那条语句的执行状态来决定。
5.多条件判断语句case
case语句基本语法:
case variable in
value1)
statement1
statement2
..
statementn;;
value2)
statement1
statement2
..
statementn;;
...
valuen)
statement1
statement2
..
statementn;;
#其它情况
*)
statement1
statement2
..
statementn;;
#相当于if 结尾fi
esac
6.利用case语句处理用户输入
例7:说明case语句的使用方法
#! /bin/bash
echo "Hit a key, then hit return."
#读取用户按下的键
read keypress
#case语句开始
case "$keypress" in
#小写字母
[[:lower:]])
echo "Lowercase letter.";;
[[:upper:]])
echo "Uppercase letter.";;
[0-9])
echo "Digit.";;
*)
echo "other letter.";;
esac
7.运算符
1.使用expr外部程序
#!/bin/bash
#注意: 要用反引号括起来
result=`expr 2 - 100`
echo "result=${result}"
result=`expr 2-100`
echo "result=${result}"
result=`expr \( 2 - 6 \) \* 12`
echo "result=${result}"
result=`expr (2-6)*12`
echo "result=${result}"
结果为
[root@VM_16_3_centos if_test]$ sh expr.sh
result=-98
result=2-100
result=-48
expr.sh: command substitution: line 12: syntax error near unexpected token `2-6'
expr.sh: command substitution: line 12: `expr (2-6)*12'
result=
使用expr命令时要注意运算符左右两边的空格,同时需要将括号进行转义表示,括号两边也要注意空格
2.使用$((…))
例10:演示使用$((…))符号进行算术运算
#!/bin/bash
result=$(( 3+6 ))
echo "result= $result"
result=$(( (1-4) * 5 ))
echo "result= $result"
result= 9
result= -15
3.使用let命令
例11:演示使用let命令执行算术运算
#! /bin/bash
n=10
let n=n+1
echo "$n"
let n=n*10
echo "$n"
let n=n**2
echo "$n"
11
110
12100
4.使用位运算符
例12:演示使用位运算符的方法
#! /bin/bash
result=$[ 2 << 3 ]
echo "$result"
result=$[ 8>> 2 ]
echo "$result"
result=$[ 8 & 4 ]
echo "$result"
result=$[ ~8 ]
echo "$result"
result=$[ 10 ^ 6 ]
echo "$result"
结果为:
16
2
0
-9
12
网友评论