自学shell编程——第2讲(test测试语句/if语句/case语句)
shell中用到的分支语句:if-then-else-fi语句;case-esac语句。控制语句:for语句;while语句;until语句
1. test测试语句,test相当于ls一类,属于shell命令
根据测试对象,将test语句分为三大类。
- 文件。可以判断是否存在(-e)、是否可读(-r)、是否可写(-w)、是否可执行(-x)、是否是目录(-d)、是否是普通文件(-f)、是否非空(-s)。
- 两个字符串或单个字符串。可以判断是否相同(=)、是否不同(!=)、是否小于(<)、是否大于(>)、长度是否非0(-n)、长度是否为0(-z)。后面两个针对单个字符串。** 注意使用=、<、>时前面加转义符号 **
- 两个数值。可以判断是否等于(-eq)、是否不等于(-ne)、是否大于(-gt)、是否大于等于(-ge)、是否小于(-lt)、是否小于等于(-le)。
** 通常test语句作为if语句的判断语句**
2. if语句:if-then-else-fi语句
这里直接给两个例子。(多练习)多个判断条件,使用或与非(||、&&、!)
#!/bin/bash
#判断命令行参数的个数是否为2。复习命令行参数的个数为参数$#
if test $# -eq 2
then
echo "two command arguments."
else
echo "error"
fi
#判断一个文件是否存在,如果是普通文件就写入hello,如果不是就打error(这里使用了两个if判断或者使用或与非)
if test -e $1
then
if test -f $1
then
echo "hello">>$1
cat $1
else
echo "Error. file is not normal file"
fi
else
echo "file is not exist"
fi
#执行:./if.sh file.txt 1
当然对于if的判断语句,你可以不用test进行测试,而是直接使用。(上面的例子1改写)
if test $# -eq 2
if [ $# -eq 2 ] #注意[]的空格,严格遵守,否则报错
3. if语句判断3个条件:if(判断条件)-then-elif(判断条件)-then-else-fi
if [ $1 \> $2 ];
then
echo "$1>$2"
elif [ $1 \< $2 ]
then
echo "$1<$2"
else
echo "$1=$2"
fi
#执行:./if.sh 13 15 #输出13<15;执行:./if.sh a b #输出a<b
总结:①if(判断条件)后面的分号(;)有无都可以。②记住if判断为真,后面跟then。③对于数值的比较尽量使用-eq/-ne/-gt/-ge/-lt/-le进行(这里有带等于的比较)。<、>、=之类可以用于数值和字符串的比较,但是在用的时候注意加\,表转义。④养成良好的书写习惯,一直保持,若使用分号,则都用。
使用逻辑关系或与非时,使用[[判断条件]](当然也有其他方式,你可以自行查找,这里提供我习惯使用的)。当然如果是test语句,两边直接用就行,不需要加任何符号
例子如下:
#!/bin/bash
#判断输入的数字,如果10<X<20则输出good,否则输出bad
if [[ $1 -gt 10 ]] && [[ $1 -lt 20 ]] #if test $1 -gt 10 && test $1 -lt 20
then
echo "good"
else
echo "bad"
fi
#如果该数刚好是100
if [ ! $1 -eq 100 ] #如果没有!,则条件为真,then输出"$1 is 100."
then
echo "$1 is not 100."
else
echo "$1 is 100."
fi
#执行:./mulif.sh 12,输出good 12 is not 100.;执行:./mulif.sh 100,输出bad 100 is 100.
4. case-esac语句。case 变量 in-XX)-xxxx;;-YY)-yyyy;;-*)-zzzz;;-esac
这里直接给一个例子。(多练习)
#!/bin/bash
case $# in
1)
echo $1;;
2)
if [ $1 \> $2 ]
then
echo "$1>$2"
else
echo "$1<=$2"
fi;;
*)
echo "arguments up to 2.";;
esac
#执行:./case.sh 7 输出7;./case.sh 2 3 输出2<=3;./case.sh 2 3 4 输出arguments up to 2.