龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 操作系统 > LINUX系统 >

Bourne Shell及shell编程(2)

时间:2011-03-20 22:37来源:未知 作者:admin 点击:
分享到:
版权声明: 本文内容为大连理工大学LINUX选修课讲义,欢迎大家转载,但禁止使用本材料进行任何商业性或赢利性活动。转载时请保留本版权声明。 作者:何斌武,hbwork@dlut.edu.cn,大连

  版权声明:

  本文内容为大连理工大学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)循环控制

   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

   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"

   使用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

   . 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

   从循环中退出: break和continue命令

   break 立即退出循环

   continue 忽略本循环中的其他命令,继续下一下循环

   在shell

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接