shell中的判断与循环
1.if语句
shell中的if语句结构如下,它通过判断command1的返回值,若0(即命令成功执行)则执行command2、command3;若1则不执行
if commandA
then
command1
command2
fi
if commandA ; then
command1
command2
fi
当然shell中也有else,还有elseif,用法分别如下:
if commandA ; then
command1
else
command2
fi
if commandA ; then
command1
elif commanB ; then
command2
elif commandC ; then
command3
fi
当需要多次判断时,也可用switch case来替代if else
case $USR in
root)
echo root
echo oh!;;
jack)
echo jack;;
peter | ben)
echo hah! hah!;;
*)
echo error;;
esac
2.test语句
test命令是if语句的好伴侣,常用来判断条件是否满足,满足返回0,不满足返回1;test可以用来比较:数值、字符串、文件/路径。常见用法为:
if test condition ; then
commands
fi
if [ condition ] ; then
commands
fi
当test用于数值比较时,基本格式为var1 参数 var2
,如下,具体参数有很多,可以上网查
if [ $var1 -eq $var2 ]
if [ $var1 -gt 2 ]
当test用于字符串比较时,基本格式也为var1 符号 var2
,此外还可以使用[[ ]]
来使用正则匹配
if [ $string1 = $string2 ] #判断变量string1和string2值是否相等
if [ $USR = !root ] #判断变量USR值是否不等于root
if [[ $USR == r* ]] #判断变量USR值是否以字母r开头
当test用于判断文件和目录的状态时,基本格式为参数 filepath
如下,具体参数有很多,可以上网查
if [ -d $MYPATH ]
if [ -e $MYPATH ]
if [ -r $MYPATH ]
if [ -x $MYPATH ]
if [ -z "$USR " ]
if [ -n "$USR " ]
对于复合判断语句,shell中使用&&
和||
来表示,尤其需要注意的是,shell中以命令返回0为真,1位假,故&&
和||
操作以逻辑真假为准,不再以数值上的0和1为准
if [ condition1 ] && [ condition2 ]
if [ condition1 ] || [ condition2 ]
此外&&还能用来作为简易版本的if语句,左边的命令返回真(即返回0),右边的命令才被执行
[ $? -ne 0 ] && mk_error "build rootfs Failed" && return 1
3.for语句
shell中for语句的基本用法是,每次循环,变量就套用列表中的元素值,循环至列表结束为止
for var in shanghai beijing "new york" guangzhou ; do
command
done
list='shanghai beijing guangzhou'
for var in $list ; do
...
for var in `cat $file ` ; do
...
platforms=(
"android"
"linux"
)
for platform in ${platforms[@]} ; do
...
for i in `seq 1000 ` ; do
command
done
现在来系统的讨论一下,for语句会将哪些字符作为列表元素的分割符?默认为空格、换行、制表符 。我们可以通过变量IFS来指定分隔符,这是极为便利的一种机制
OLDIFS=$IFS
IFS=$'\n:;'
IFS=$OLDIFS
for语句还有一种强大的用法,即用通配符获取文件/目录
for file in /home/root/.b* /home/root/test
do
if [ -d $file ]
.....
4.while语句
while语句的基本用法是判断commandA的返回值,若真(0)则循环,若假(1)则跳出
while commandA ; do
commands
done
while [ $var1 -gt 0 ] ; do
while [ condition1 ] && [ condition2 ] ; do
while [ condition1 ] || [ condition2 ] ; do
until语句具有与while语句相反的功能,若假(1)则循环,若真(0)则跳出。它们用法的格式完全相同
5.循环控制语句
break语句可以打断并跳出循环,默认往外跳出一层,当然我们也能指定往外跳出多少层,如:
for i in `seq 1000 ` ; do
for j in `seq 1000 ` ; do
....
if [ .... ];then
echo "error"
break 2
fi
done
done
continue语句可以跳过循环体剩余的部分,默认重新进入一次循环,当然我们也能指定重新进入往外哪一层循环,如:
for i in `seq 1000 ` ; do
for j in `seq 1000 ` ; do
....
if [ .... ];then
echo "error"
continue 2
fi
done
done