这章还剩一点,搞定再睡觉,尽管明早还要上班!!!
case
cade的语法如下:
case expression in
pattern1 ) statements ;;
pattern2 ) statements ;;
....
....
* ) statements ;;
esac
有几点需要注意的,首先是pattern实际上可以由||分隔的几个模式组成,相当于或。再者是小括号 ) 前面是有一个空格的,每种条件后面结束时是有两个分号;;。最后一个模式*是匹配所有,相当于c++里面的缺省。
select
select语法:
select name [in list]
do
statements that can use $name....
done
select可以很容易生成菜单,除了关键字之外,语法和for是一样的。
.生成列表内每一条目的菜单,并且将之格式化,是每一选择对应一个数字。
.提示用户输入数字
.将已选条目保存在变量name中,已选择编号保存在内置变量REPLY中。
.执行条目内的语句。
.无限循环该过程。
........(貌似后面还有不少,以后补全)
今天来把它补全吧。。。。。
问题:编写脚本,将PATH里面的目录逐个打印出来,并在前面加上编号。
代码如下:
#!/bin/bash
IFS=:
PS3='directory?'
select selection in $PATH; do
if [ $selection ]; then
echo "$selection"
break
else
echo 'invalid selection'
fi
done
首先将IFS设置成冒号:,PS3的环境变量是提示符,现在修改成directory?。
while和until
这两个的判断和c++是完全了类似的。
while的语法:
while condition
do
statements....
done
condition实际上是要运行的语句列表。最后一个语句的退出状态被用作条件的取值。这里可是使用带有test的条件语句。
until的语法:
until command; do
statement....
done
这个意思是执行语句,直到命令运行正确。
上个打印PATH内容的问题,现在可以这样解决,不使用IFS变量。
可以使用while和模式匹配遍历PATH列表:
path=$PATH:
while [ $path ]; do
ls -ld ${path%%:*}
path=${path#*:}
done
先给path赋值,注意在后面加上一个冒号:,这样使每个目录后面都有一个冒号。
下面是until的一个例子:
编写脚本试图将文件复制到一个目录,如果失败,等待五秒,然后再试,直至成功。
代码如下:
until cp $1 $2; do
echo 'failed.waiting.....'
sleep 5
done
转换成while可以这样:
while ! cp $1 $2; do
echo 'failed.waiting.....'
sleep 5
done
阅读(1216) | 评论(0) | 转发(0) |