Chinaunix首页 | 论坛 | 博客
  • 博客访问: 172400
  • 博文数量: 71
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 875
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 08:20
文章存档

2010年(13)

2009年(14)

2008年(44)

我的朋友

分类: LINUX

2008-11-12 09:19:14

9.5.1. break 内建命令

break 语句用来在正常结束之前退出当前循环。一般在当你事先不知道循环得执行多少次的时候使用,比如因为是依赖于用户输入的。

下面的例子证明了一个 while 循环是可以被中断的。这是 的 wisdom.sh 脚本稍微改进过的版本。

#!/bin/bash

# This script provides wisdom
# You can now exit in a decent way.

FORTUNE=/usr/games/fortune

while true; do
echo "On which topic do you want advice?"
echo "1.  politics"
echo "2.  startrek"
echo "3.  kernelnewbies"
echo "4.  sports"
echo "5.  bofh-excuses"
echo "6.  magic"
echo "7.  love"
echo "8.  literature"
echo "9.  drugs"
echo "10. education"
echo

echo -n "Enter your choice, or 0 for exit: "
read choice
echo

case $choice in
     1)
     $FORTUNE politics   #表示politics在FORTUNE=/usr/games/fortune目录下
     ;;
     2)
     $FORTUNE startrek
     ;;
     3)
     $FORTUNE kernelnewbies
     ;;
     4)
     echo "Sports are a waste of time, energy and money."
     echo "Go back to your keyboard."
     echo -e "\t\t\t\t -- \"Unhealthy is my middle name\" Soggie."
     ;;
     5)
     $FORTUNE bofh-excuses
     ;;
     6)
     $FORTUNE magic
     ;;
     7)
     $FORTUNE love
     ;;
     8)
     $FORTUNE literature
     ;;
     9)
     $FORTUNE drugs
     ;;
     10)
     $FORTUNE education
     ;;
     0)
     echo "OK, see you!"
     break
     ;;
     *)
     echo "That is not a valid choice, try a number from 0 to 10."
     ;;
esac  
done

注意 break 退出循环,而不是脚本。可以在脚本的结尾处加一个 echo 命令来证明。这个 echo 也会执行will also be executed upon input that causes break to be executed (when the user types “0”).

在嵌套循环中,break 允许指定哪个循环退出。参见Bash info 页面得到更多信息。

9.5.2. continue 内建命令

continue 语句继续 for, while, until or select 内的循环。

当在 for 循环使用的时候,控制变量取得列表中的下一个元素的值。当在一个 while 或者 until 结构中使用时,另一方面,执行随着 TEST-COMMAND 在循环的顶部继续。

9.5.3. 例子

在以下的例子中,文件名转化成小写。如果不需要转化,一个 continue 语句使得循环执行重新开始。这个命令不会消耗太多的系统资源,多数情况下,相似的问题可以通过使用 sedawk 来解决。然而,当执行繁重任务的时候了解这样的结构是非常有用的,比没有太大必要把测试插入到一个脚本的正确位置,节约系统资源。

[carol@octarine ~/test] cat tolower.sh
#!/bin/bash

# This script converts all file names containing upper case characters into file# names containing only lower cases.

LIST="$(ls)"

for name in "$LIST"; do

if [[ "$name" != *[[:upper:]]* ]]; then
continue
fi

ORIG="$name"
NEW=`echo $name | tr 'A-Z' 'a-z'`

mv "$ORIG" "$NEW"
echo "new name for $ORIG is $NEW"
done

这个脚本至少有一个弱点:覆盖存在的文件。noclobber 选项对Bash来说只有在重定向发生才有作用。 mv 命令的 -b 选项提供更多安全性,但是只能防止在一次意外的覆盖,在这个测试中证明:

[carol@octarine ~/test] rm *

[carol@octarine ~/test] touch test Test TEST

[carol@octarine ~/test] bash -x tolower.sh
++ ls
+ LIST=test
Test
TEST
+ [[ test != *[[:upper:]]* ]]
+ continue
+ [[ Test != *[[:upper:]]* ]]
+ ORIG=Test
++ echo Test
++ tr A-Z a-z
+ NEW=test
+ mv -b Test test
+ echo 'new name for Test is test'
new name for Test is test
+ [[ TEST != *[[:upper:]]* ]]
+ ORIG=TEST
++ echo TEST
++ tr A-Z a-z
+ NEW=test
+ mv -b TEST test
+ echo 'new name for TEST is test'
new name for TEST is test

[carol@octarine ~/test] ls -a
./  ../  test  test~

trtextutils 包的一部分;它能实现所有的字符转化。

阅读(681) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~