与传统语言不同的是,shell用于指定条件值的不是布尔表达式而是命令和字符串。
条件判断命令 —— test
test命令用于检查某个条件是否成立,它可以进行数值,字符和文件三个方面的测试。
test 表达式1 -参数 表达式2
或
test -参数 表达式
结果为真返回0, 结果为假返回1.
test语句的等价形式为:
[ 表达式1 -参数 表达式2 ]
- 可用中括号代替test
- 注意表达式与中括号间有空格
数值测试
- -eq —— 等于则为真
- -ne —— 不等于则为真
- -gt —— 大于则为真
- -ge —— 大于等于则为真
- -lt —— 小于则为真
- -le —— 小于等于则为真
例如:
示例1:
#!/bin/bash
test 1 -lt 4
echo $?
示例2:
if test $1 -gt 0
then
echo "$1 number is positive"
fi
字符串测试
- = —— 等于伟真
- != —— 不想等则为真
- -z 字符串 —— 字符串长度=0则为真
- -n 字符串 —— 字符串长度不为0则为真
#!/bin/bash
TESTSTRING1="1"
TESTSTRING2="2"
test TESTSTRING1 != TESTSTRING2
echo $?
test -z TESTSTRING1
echo $?
文件测试
- -e 文件名 —— 如果文件存在则为真
- -r 文件名 —— 如果文件存在且可读则为真
- -w 文件名 —— 如果文件存在且可写则为真
- -x 文件名 —— 如果文件存在且可执行则为真
- -s 文件名 —— 如果文件存在且至少有一个字符则为真
- -d 文件名 —— 如果文件存在且为目录则为真
- -f 文件名 —— 如果文件存在且为普通文件则为真
- -c 文件名 —— 如果文件存在且为字符型特殊文件则为真
- -b 文件名 —— 如果文件存在且为块特殊文件则为真
逻辑操作运算符
linux还提供了 !, -o, -a 三个逻辑操作符将测试条件连接起来;其优先级为 ! 最高, -a 次之, -o最低:
- -a —— 逻辑与
- -o —— 逻辑或
- ! —— 逻辑非
条件分支语句 —— if
一般格式为:
if 条件命令判断串
then
条件为真时的命令串
else
条件为假时的命令串
fi
或
if 条件命令判断串;then
条件为真时的命令串
else
条件为假时的命令串
fi
例如:
run.sh
#!/bin/bash
if [ $# -eq 0 ]; then
echo "input 0 parameter"
elif [ $# -gt 1 ]; then
echo "input more than 1 parameters"
else
echo "input 1 parameter"
fi
条件分支语句 —— case
case条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法,其格式如下:
case 字符串 in
表达式1)
若干个命令行
;;
表达式2)
若干个命令行
;;
... ...
*)
其他命令行
esac
每个条件分支后必须以两个分号结尾。
shell通过计算字符串的值,将其结果依次和表达式1,表达式2,等进行比较,直到找到一个匹配的表达式为止,如果找到了匹配项则执行它下面的命令直到遇到一对分号;;为止。
在case表达式中也可以使用shell的通配符 *, ?, [] 。通常用 * 作为case命令的最后表达式以便使在前面找不到任何相应的匹配项时执行 其他命令行 的命令。
例如:
run.sh
#!/bin/bash
case "$#" in
0) echo "input o parameter" ;;
1) echo "input 1 parameter" ;;
*) echo "input more than 1 parameters"
esac
循环控制语句 —— for
for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以艾程序以外以位置参数的形式提供,for循环的一般格式为:
for 变量名 [in 数值列表]
do
若干个命令行
done
变量名可以是用户选择的任何字符串,在in之后给出的数值序列将顺序替换循环命令列表中的$var。如果省略了in,则变量的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。
例如:
run.sh
#!/bin/bash
for i
do
echo $i
done
#!/bin/bash
for i in value1 value2 value3 value4
do
echo $i
done
循环控制语句 —— while 和 until
while和until命令都是用命令的返回值状态值来控制循环的。while循环的一般格式为:
while
若干个命令行
do
若干个命令行
done
只要while的若干个命令行中最后一个命令的返回状态为真,while循环就继续执行do done之间的若干个命令行。
until命令是另一种循环结构,until和while循环的区别在于:while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。其格式为:
until
若干个命令行
do
若干个命令行
done
shell还提供了true和false两条命令用于建立无限循环结构的需要,他们的返回状态分别为0和非0.
例如:
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
i=$[$i+1] #[] command is used to sum
done
无条件控制语句 —— break 和 continue
- break语句用于立即终止当前循环的执行
- continue用于不执行循环中后面的语句而立即开始下一个循环的执行
- 这两个语句只有放在do和done之间才有效