首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
Google
首页 入门 Linux编程 系统管理 网络管理 Linux认证 Unix/BSD Linux数据库 Linux集群 Linux手册 Linux下载 Ubuntu 论坛 专题 RSS
您现在的位置: 中国IT实验室 >> Linux >> Linux编程 >> SHELL编程 >> 正文

Bourne Shell及shell编程(2)


  版权声明:
  本文内容为大连理工大学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 忽略本循环中的其他命令,继续下一下循环
   在shell
【责编:admin】
中国IT教育
相关产品和培训
文章评论
 友情推荐链接
 专题推荐

 ·防范Linux病毒 打造没有病毒的乐土…
 ·Linux Shell编程实用指南…
 ·Linux日志分析与管理
 ·揭密Linux内存管理
 ·邮件服务Sendmail应用配置
 ·Linux 安全管理…
 ·Linux 下DNS服务器架设攻略…
 ·Linux 下的路由的配置与应用…
 ·专题:Apache实用手册
 ·全面剖析Linux文件系统
 今日更新
 认证培训
 频道精选
 Windows频道导航