$read var1 var2 var3
输入:Hello my friend
$echo $var1 $var2 $var3
结果显示:Hello my friend
$echo $var2
结果显示:my
下面用个read和case的例子结束本部分的学习:
#--交互式备份,恢复程式
echo "输入要备份文档所在目录:\c"
read WORKDIR
if [ !-d $WORKDIR ]
then
echo "Sorry,$WORKDIR is not a directory"
exit 1
fi
cd $WORKDIR
echo "输入选择:"
echo _
echo "1.恢复到 $WORKDIR"
echo "2.备份 $WORKDIR"
echo "0.退出"
echo
echo "\c"
read CHOICE
case "$CHOICE" in
1)echo "恢复中... ..."
cpio -i < /dev/mnt0;;
2)echo "备份中... ..."
ls | cpio -o > /dev/mnt0;;
0)exit 1
*)exit 1
esac
if [ $? -ne 0 ]
then
echo "程式运行中出现错误!"
else
echo "操作成功!"
fi
在上面代码中,"*"定义了其他模式下不匹配时的默认操作。
循环语句
前面介绍的程式和所学的语句都是从头到尾成一条主线下来,或是成分支结构,在日常管理UNIX的过程中,经常要重复的做一些操作,处理批量的问题,这就涉及到了循环结构,同高级语言相似,UNIX的Shell也提供了强大的循环处理语句。
Bsh语言中有三种循环语句-while循环、until循环、for循环,下面通过具体的例子分别介绍这三种结构。
While循环
在while循环语句中,当某一条件为真时,执行指定的命令。语句的结构如下:
while command
do
command
command
… …
done
示例代码如下:
#测试while循环小程式
x_t=1
while [ $x_t -lt 5 ]
do
mm=` expr $x_t \* $int ` #注意"\"的作用
echo "$mm"
x_t=` expr $x_t 1 ` #注意expr的用法
done
echo "THE WHILE IS END!\n"
程式的执行结果如下:
1
4
9
16
THE WHILE IS END
在上述程式中,当变量x_t的值小于5的时候,执行while循环中的语句。在第五次循环时, [ $x_t-lt5]命令返回非零值,于是程式执行done后面的代码。
现在利用while循环,能够改进我们早些时候用的备份数据的例子,当用户指定的目录备份完毕后,使用while循环使程式执行一次能够备份多个用户指定的目录。代码如下:
echo "欢迎使用备份小程式"
ANS=Y
while [ $ANS = Y -o $ANS = y ]
do
echo _
#读目录名
echo "输入要备份的目录名:\c"
read DIR
if [ ! -d $DIR ]
then
echo "$DIR不是个目录!"
exit 1
fi
cd $DIR
echo "请选择:"
echo _
echo "1 恢复数据到 $DIR"
echo "2 备份$DIR的数据"
echo
echo "请选择:\c"
read CHOICE
case "$CHOICE" in
1) echo "恢复中… …"
cpio -i 2) echo "备份中… …"
cpio -o >/dev/rmt0;;
*) echo "选择无效"
esac
if [ $? -ne 0 ]
then
echo "cpio执行过程中出现问题"
exit 2
fi
echo "继续别的目录吗?(Y/y)\c"
read ANS
done
在程式开始,我们给变量ANS符值为Y,根据whlie的判断条件,程式进入while循环,执行do-done中的语句,每次循环都需要用户输入ANS的值用来判断是否进行下次重复执行do-done中的语句。假如用户输入的条件不满足while语句条件,循环结束,程式执行done后面的语句。
Unix系列shell程式编写(下)
Until语句
While语句中,只要某条件为真,则重复执行循环代码,until语句正好同while相反,该语句使循环代码重复执行,直到碰到某一条件为真才停止。
Until语句的结构如下:
until command
do
command
command
… …
done
能够用until语句替换上面备份程式的while语句,完成同样的功能:
until [ $ANS != Y -a $ANS != y ]
for 循环
在介绍for循环之前,我们要学个很有用的unix命令:shift。我们知道,对于位置变量或命令行参数,其个数必须是确定的,或当Shell程式不知道其个数时,能够把任何参数一起赋值给变量$*。若用户需要Shell在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在$1后为$2,在$2后面为$3等。在 shift命令执行前变量$1的值在shift命令执行后就不可用了。
示例如下:
#测试shift命令(x_shift.sh)
until [ $# -eq 0 ]
do
echo "第一个参数为: $1 参数个数为: $#"
shift
done
执行以上程式x_shift.sh:
$./x_shift.sh 1 2 3 4
结果显示如下:
第一个参数为: 1 参数个数为: 3
第一个参数为: 2 参数个数为: 2
第一个参数为: 3 参数个数为: 1
第一个参数为: 4 参数个数为: 0
从上可知shift命令每执行一次,变量的个数($#)减一,而变量值提前一位,下面代码用until和shift命令计算任何命令行参数的和。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




