Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103121846
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-28 21:31:24

 
文章来源from altmayer.dhs.org 

  版权声明:
  本文内容为大连理工大学LINUX选修课讲义,欢迎大家转载,但禁止使用本材料进行任何商业性或赢利性活动。转载时请保留本版权声明。
  作者:何斌武,hbwork@dlut.edu.cn,大连理工大学网络中心
  源码:--------------------------------------------------------------------------------
  Bourne Shell及Shell编程(2)
   h.交互式从键盘读入数据
   使用read语句,其格式如下:
   read var1 var2 ... varn
   read将不作变量替换,但会删除多余的空格,直到遇到第一个换行符(回车),并将输入值依次赋值给相应的变量。
   例:
   $ read var1 var2 var3
   Hello my friends
   $ echo $var1 $var2 $var3
   Hello my friends
   $ echo $var1
   Hello
   $ read var1 var2 var3
   Hello my dear friends
   $ echo $var3
   dear friends <-输入多余变量时,输入值余下的内容赋给最后一个变量
   $ read var1 var2 var3
   Hello friends
   $ echo $var3
   <- var3为空
   $
   在shell script中可使用read语句进行交互操作:
   ...
   #echo -n message 输出结果后不换行
   echo -n "Do you want to continue: Y or N"
   read ANSWER
   if [ $ANSWER=N -o $ANSWER=n ]
   then
   exit
   fi
   i. case结构:结构较elif-then结构更清楚
   比较if-then语句:
   if [ variable1 = value1 ]
   then
   command
   command
   elif [ variable1 = value2 ]
   then
   command
   command
   elif [ variable1 = value3 ]
   then
   command
   command
   fi
   相应的case结构:
   case value in
   pattern1)
   command
   command;;
   pattern2)
   command
   command;;
   ...
   patternn)
   command;
   esac
   * case语句只执行第一个匹配模式
   例:使用case语句建立一个菜单选择shell script
   #Display a menu
   echo _
   echo "1 Restore"
   echo "2 Backup"
   echo "3 Unload"
   echo
   #Read and excute the user's selection
   echo -n "Enter Choice:"
   read CHOICE
   case "$CHOICE" in
   1) echo "Restore";;
   2) echo "Backup";;
   3) echo "Unload";;
   *) echo "Sorry $CHOICE is not a valid choice
   exit 1
   esac
   在上例中,*指默认匹配动作。此外,case模式中也可以使用逻辑操作,如下所示:
   pattern1 | pattern2 ) command
   command ;;
   这样可以将上面示例程序中允许用户输入数字或每一个大写字母。
   case "$CHOICE" in
   1|R) echo "Restore";;
   2|B) echo "Backup";;
   3|U) echo "Unload";;
   *) echo "Sorry $CHOICE is not a valid choice
   exit 1
   esac
  (5)循环控制
   <1> while循环:
   格式:
   while command
   do
  command
  command
  command
   ...
   done
   例: 计算1到5的平方
   #!/bin/sh
   #
   #Filename: square.sh
   int=1
   while [ $int -le 5 ]
   do
   sq=`expr $int \* $int`
   echo $sq
   int=`expr $int + 1`
   done
   echo "Job completed"
  
   $ sh square.sh
   1
   4
   9
   16
   25
   Job completed
   <2> until循环结构:
   格式:
   until command
   do
  command
  command
   ....
  command
   done
   示例:使用until结构计算1-5的平方
   #!/bin/sh
   int=1
   until [ $int -gt 5 ]
   do
   sq=`expr $int \* $int`
   echo $sq
   int=`expr $int + 1`
   done
   echo "Job completed"
   <3> 使用shift对不定长的参数进行处理
   在以上的示例中我们总是假设命令行参数唯一或其个数固定,或者使用$*将整个命令行参数传递给shell script进行处理。对于参数个数不固定并且希望对每个命令参
  数进行单独处理时则需要shift命令。使用shift可以将命令行位置参数依次移动位置 ,
   即$2->$1, $3->$2. 在移位之前的第一个位置参数$1在移位后将不在存在。
   示例如下:
   #!/bin/sh
   #
   #Filename: shifter
   until [ $# -eq 0 ]
   do
   echo "Argument is $1 and `expr $# - 1` argument(s) remain"
   shift
   done
   $ shifter 1 2 3 4
   Argument is 1 and 3 argument(s) remain
   Argument is 2 and 2 argument(s) remain
   Argument is 3 and 1 argument(s) remain
   Argument is 4 and 0 argument(s) remain
   $
   使用shift时,每进行一次移位,$#减1,使用这一特性可以用until循环对每个参
   数进行处理,如下示例中是一个求整数和的shell script:
   #!/bin/sh
   # sumints - a program to sum a series of integers
   #
   if [ $# -eq 0 ]
   then
   echo "Usage: sumints integer list"
   exit 1
   fi
   sum=0
   until [ $# -eq 0 ]
   do
   sum=`expr $sum + $1`
   shift
   done
   echo $sum
   $ sh sumints 324 34 34 12 34
   438
   $
   使用shift的另一个原因是Bourne Shell的位置参数变量为$1~$9, 因此通过位置变量
   只能访问前9个参数。但这并不等于在命令行上最多只能输入9个参数。此时如果想访问前9个参数之后的参数,就必须使用shift.
   另外shift后可加整数进行一次多个移位,如:
   shift 3
   <4>. for循环
   格式:
   for var in arg1 arg2 ... argn
   do
  command
   ....
  command
   done
   示例:
   $ for letter in a b c d e; do echo $letter;done
   a
   b
   c
   d
   e
   对当前目录下的所有文件操作:
   $ for i in *
   do
   if [ -f $i ]
   then
  echo "$i is a file"
   elif [ -d $i ]
  echo "$i is a directory"
   fi
   done
   求命令行上所有整数之和:
   #!/bin/sh
   sum=0
   for INT in $*
   do
   sum=`expr $sum + $INT`
   done
   echo $sum
   <6> 从循环中退出: break和continue命令
   break 立即退出循环
   continue 忽略本循环中的其他命令,继续下一下循环
  
阅读(422) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~