条件测试
条件测试的基本语法
shell程序中,当指定条件为真时,返回0;为假时,返回非0。
条件测试的语法有两种,分别为test命令和[命令
test expression
expression可以由字符串,整数,文件名,以及各种运算符组成。
例如:
1 -eq 2 测试两个整数是否相等
‘string’ 字符串是否为空
-z 'string' 字符串是否为空
-e file 指定的文件是否存在
[ expression ] Shell要求在条件表达式后面追加一个右方括号来与前面的 [ 配对。条件表达式与左右方括号之间必须要有空格。
字符串测试
string 本身代表字符串是否为空 不可以与 [ 一起使用
string1 = string2
string1 != string2
-n string 判断字符串是否为非空串
-z string 判断字符串是否是空串
#! /bin/sh
a='abc'
test $a
echo 'test $a' $?
test -n "$a"
echo 'test -n "$a"' $?
test -z "$a"
echo 'test -z "$a"' $?
a="hello"
b="world"
[ "$a" = "$b" ]
echo '[ "$a" = "$b" ]' $?
[ "$a" != "$b" ]
echo '[ "$a" != "$b" ]' $?
----------------------------
[hdli@localhost shell]$ ./teststring.sh
test $a 0
test -n "$a" 0
test -z "$a" 1
[ "$a" = "$b" ] 1
[ "$a" != "$b" ] 0
运算符的左右两边必须保留空格,否则执行的是test “string”/[ 'string' ]的命令,并且永远返回的是0
在测试运算符 “=”、“!="、-z 等符号的左右两边一定要有空格
整数测试
在程序设计中,两个整数值得比较是经常遇到的。
test number1 op number2
[ number1 op number2 ]
number1 -eq number2
number1 -ne number2
number1 -gt number2
number1 -lt number2
number1 -ge number2
number1 -le number2
文件测试
test op file
[ op file ]
-a file 文件是否存在-b file 文件是否存在且为块文件
-c file 文件是否存在且为字符文件
-d file 文件是否存在且为目录
-e file 文件是否存在
-s file 文件长度是否大于0或者文件为非空文件
-f file 文件存在,并且为常规文件
-w file 文件是否存在,并且可写
-L file 文件是否存在,并且为符号链接
-u file 文件是否设置suid位。
-r file 文件是否存在,并且可读
-x file 文件是否存在,并且可执行
-nt 表示某个指定文件修改时间是否比另外一个文件晚
-ot 表示某个指定的文件是否比某个文件早
逻辑操作符
! expression 非
expression1 -a expression2 且
expression1 -o expression2 或
test "$a" -gt 20 -a "$a" -le 60 a是否大于20小于等于60
[ -x file1 -a -w file1 ] file1是否可读可执行
运算符
算术运算符
+
-
*
/
%
+=
-=
*=
/=
%=
<<
>>
&
|
~
^
** 冥运算,3**3就是3的3次方
expr expression
fli3@SZPC1895 ~
$ echo `expr \( 2 - 6 \) \* 12`
-48
数字与括号间要有空格 ,运算符与数字之间也要有空格
$((...))
使用这种形式来进行算术运算写法比较自由,无需对运算符和括号做转义处理,可以采用松散或者紧凑的格式来书写表达式。
result=$((3+6))
result=$(( 3 * 6 ))
$[...]使用方式同上
使用let命令,其可以执行一个或者多个算术表达式,其中的变量名无需使用$符号。如果表达式中含有空格或者其他特殊字符,则必须将其引用起来
n=10
let n=n+1
echo $n
数字常量的进制
两种表示方法:
以0开头的数字表示八进制
正常的数字是十进制
以0x开头的是十六进制
使用#,2#1000就是一个二进制数字,8#42就是一个8进制,16#AB就是一个十六进制