1、条件测试
在shell中,条件判断的结果与其它语言是相反的。
其它语言中当值为0时表示判断为假,值非0时表示判断为真。而在shell中却是值为0时表示判断为真,值非0时才判断为假。
shell中的条件测试是指用户给定一个表达式,然后判定这个表达式的值为真或假。
其实条件测试就是条件判断的基石,只不过shell中允许条件表达式在脱离了条件关键字后独立存在,所以才单独拿出来解释而已。
在shell中可以通过以下两种方式来完成条件测试:
1、test命令;
2、[ 命令;
这两种命令是等价的,可以随意使用。
test命令的用法如下所示:
test 表达式
[ 命令虽然在只是一个单纯的“标点符号”,但它在shell中确确实实可以作为一个命令使用。不过为了结构工整,在用完 [ 时一般还会要求补上一个 ] 符号。[ 命令的用法如下:
[ 表达式 ]
需要注意的是:shell中各命令之间必须用空格符隔开,[ 也是一个命令,因此在使用 [ 命令做条件测试时一定要在起始和结束符前后各加一个空格字符。
表达式中通常包含以下三种类型:
1、字符串测试;
2、整数测试;
3、文件测试;
字符串测试:
运算符 | 释义 |
string | 判断字符串string是否有值。当string中有内容时返回值0,表示真。当string不存在时返回值非0表示假。 |
string1 = string2 | 判断两个字符串的内容是否相同。值0表示相同,非0表示不同。 |
string1 != string2 | 判断两个字符串的内容是否不同。 |
-n string | 判断字符串string的内容是否为非空。 |
-z string | 判断字符串string的内容是否为空。与上一条相对。 |
必须要注意的是,如果测试字符串时是引用变量的,则最好用双引号将变量包围起来,否则可能会出现奇怪的结果。
整数测试:
运算符 | 释义 |
number1 -eq number2 | 比较两个整数的值是否相等。如果相等,返回值为0。其运算符含义为 equal to |
number1 -ne number2 | 比较两个整数的值是否不等。 |
number1 -gt number2 | 比较number1是否大于number2。其运算符含义为 greater than |
number1 -lt number2 | 比较number1是否小于number2。 |
number1 -ge number2 | 比较number1是否大于或等于number2。 |
number1 -le number2 | 比较number1是否小于或等于number2。 |
必须要注意的是:在shell中对整数的比较只能使用上表中的运算符而不能像其它编程语言那样用 = 或 !=。 = 与 != 在shell中只能用于比较字符串,如果对数值比较应用了这两个运算符,则其实是将整数当成字符串来比较了。
文件测试:
运算符 | 释义 |
-a file | 判断指定文件是否存在,若文件存在,则返回值为0。 |
-b file | 判断文件是否存在且为二进制文件。 |
-c file | 判断文件是否存在且为普通字符文件。 |
-d file | 判断文件是否存在且为目录。 |
-e file | 与-a file相同,判断文件是否存在。 |
-s file | 判断文件的长度是否大于0。 |
-f file | 判断文件是否存在且为常规文件。 |
-w file | 判断文件是否存在且具有写权限。 |
-L file | 判断文件是否存在且为链接文件。 |
-u file | 判断文件是否设置了suid权限位。 |
-r file | 判断文件是否存在且具有读权限。 |
-x file | 判断文件是否存在且具有执行权限。 |
以上三种类型在条件测试中均可组成一个完整的表达式。但事实上shell还允许一条测试语句中包含多个表达式的情况。多个表达式之间以 -a 或 -o 来连接。 -a表示and连接,-o表示or连接。
还可以在表达式前加 ! 符表示对此表达式的结果取反。
2、条件判断语句
条件判断语句则是在上一节条件测试的基础之上根据结果来选择接下来的执行分支的语法。
与其它语言相似,shell中的条件判断是以关键字 if 来表达的。只不过shell中因为在普通语句中没有花括号,if 表达式要以 fi 表示代码块结束。同时在开始比较前和表达式之后还得加以 then 关键字。具体如下:
if 表达式 then 语句1 语句2 fi
一般我们习惯将 if 和 then 写在同一行。在shell中若多条语句写在同一行,则不同语句之间须以分号隔开,如:
if 表达式; then 语句1 语句2 fi
另外,出于方便,我们还会将表达式直接以条件测试语句替换。如:
if test -n string1; then fi if [ -f file1 ]; then fi
对于多条件分支的写法则如下所示:
if 条件测试语句1; then elif 条件测试语句2; then else fi
3、多分支判断语句
即其它编程语言中的 switch--case 语句。shell中的语法如下:
case 表达式 in value1) 语句1 语句2 ;; value2) 语句1 语句2 ;; *) 语句1 语句2 ;; esac
shell中没有switch关键字,取而代之的是直接以case关键字起头,各条件分支以 值+) 的方式表示。传统编程语言中的break关键字则以 ;; 替代。传统编程语言中的default关键字则以 *) 替代。
4、算术运算符
shell中的算术运算符大体上与传统编程语言一致,如加减乘除移位等。不过在shell中求幂运算的运算符为 ** ,如:3**3 的运算结果为27。
另外,在shell中直接应用算术运算符是会被解析成普通字符串字面量的。要做算术运算,可以有如下两种方式:
1、expr 命令;
2、$(()) 语句;
3、let 命令;
expr 是一个shell命令,用于计算某个表达式的值,表语法如下:
expr 表达式 #示例 result1=`expr 3 + 8` result2=`expr 4 / 8` result3=`expr 3 ** 3`
result4=`expr \( 2 + 3 \) \* 8`
$(()) 表达式会比expr自由一些,它无需使用转义字符。语法如下:
$((表达式)) #示例 result1=$(( 3 + 9 )) result2=$(( 6 * 22 ))
let 命令可以执行一个或多个算术表达式,且若其引用变量时无须使用 $ 符。语法如下:
n=10 let n=n+4 let n=n**2