if语句测试条件,测试条件返回真(0)或假(1)后,可相应执行一系列语句。if语句结构对错误检查非常有用。其格式为:
if 条件1
then 命令1
elif 条件2
then 命令2
else 命令3
fi
使用if语句时,必须将then部分放在新行,否则会产生错误。如果要不分行,必须使用命令分隔符。本书其余部分将采取这种形式。现在简单if语句变为:
if 条件;then
命令
fi
举例:
wangnc> pg grepstr
#!/bin/sh
echo "Enter a list of names:"
read list
if echo $list | grep "peter" > /dev/null 2>&1
then
echo "peter is here"
else
echo "peter is not in the list"
fi
wangnc>
wangnc> pg iftest2
#!/bin/sh
echo "Enter your name:"
read NAME
if [ "$NAME" = "" ]; then
echo "You did not enter any information!"
fi
wangnc>
wangnc> pg ifparam
#!/bin/sh
if [ $# -lt 3 ]; then
echo "Usage:`basename $0` arg1 arg2 arg3"
exit 1
fi
echo "arg1:$1"
echo "arg2:$2"
echo "arg3:$3"
wangnc>
有时需要知道脚本运行是交互模式(终端模式)还是非交互模式(cron或at)。脚本也许需要这个信息以决定从哪里取得输入以及输出到哪里,使用test命令并带有- t选项很容易确认这一点。如果test返回值为1,则为交互模式。
if [ -t ]; then
echo "we are interactive with a terminal"
else
echo "we must running from some background process probably cron or at"
fi
举例:建目录例子
wangnc> pg ifmkdir
#!/bin/sh
DIR=$1
if [ "$DIR" = "" ]
then
echo "Usage:`basename $0` directory"
exit 1
fi
if [ -d $DIR ]; then
: #do nothing
else
echo "The directory $DIR do not exits!"
echo "Create it noew?[Y|N]"
read YN
if [ "$YN" = "y" ] || [ "$YN" = "Y" ]
then
echo "creating now"
mkdir $DIR >/dev/null 2>&1
if [ $? != 0 ]
then
echo "errors creating the directory $DIR" >&2
exit 1
fi
else
: #do nothing
fi
fi
wangnc>
############################# case ######################################
case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
命令1
...
;;
模式2)
命令2
...
;;
esac
模式部分可能包括元字符,与在命令行文件扩展名例子中使用过的匹配模式类型相同,即:
* 任意字符。
?任意单字符。
[..] 类或范围中任意字符。
举例:
wangnc>pg caseselect
#!/bin/sh
echo "enter a number from 1 to 5:"
read NUM
case $NUM in
1|2) echo "is less then 3"
;;
3) echo "is 3"
;;
4) echo "is 4"
;;
5) echo "is 5"
;;
*) echo "`basename $0`:this is not between 1 and 5" >&2
exit 1
;;
esac
wangnc>
############################## for #######################################
for循环一般格式为:
for 变量名 in 列表
do
命令1
命令2⋯
done
举例:
wangnc>pg forloop
#!/bin/sh
for loop in `ls`
do
echo $loop
done
echo "another==========="
for params
do
echo "the param:$params"
done
echo "another==========="
for params in "$@"
do
echo "the param:$params"
done
echo "another==========="
counter=0
for files in *
do
counter=`expr $counter + 1`
done
echo "there are $counter files in `pwd` we need to process"
wangnc>
############################## until #########################################
until循环格式为:
until 条件
命令1
. . .
done
条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。
until循环做监视条件也很有用。假定要监视文件系统容量,当它达到一定水平时通知超级用户。
wangnc>pg untilmon
#!/bin/sh
LOOKOUT=`df | grep /home | awk '{print $5}' | sed 's/%//g'`
echo $LOOKOUT
until [ $LOOKOUT -gt 90 ]
do
echo "Filesystem /home is nearly full" | mail root
exit 0
done
wangnc>
############################# while ##########################################
while循环用于不断执行一系列命令,也用于从输入文件中读取数据,其格式为:
while 命令
do
命令1
命令2
. . .
done
虽然通常只使用一个命令,但在while和do之间可以放几个命令。命令通常用作测试条件。
只有当命令的退出状态为0时,do和done之间命令才被执行,如果退出状态不是0,则循环终止。
while循环最常用于从一个文件中读取数据,因此编写脚本可以处理这样的信息。while循环使用输入重定向以保证从文件中读取数据。
wangnc>pg whileread
#!/bin/sh
while read LINE
do
echo $LINE
done < name.txt
wangnc>
对于while循环,只需将空命令直接放在while后,即为无限循环,格式为:
while :
do
命令
done
############################# continue和break #################################
break命令允许跳出循环。break通常在进行一些处理后退出循环或case语句。如果是在一个嵌入循环里,可以指定跳出的循环个数。例如如果在两层循环内,用break 2刚好跳出整个循环。
continue命令类似于break命令,只有一点重要差别,它不会跳出循环,只是跳过这个循环步。

