IT猫扑网:您身边最放心的安全下载站! 最新更新| 软件分类| 专题汇总| 手机版

您当前所在位置:IT猫扑网 > 操作系统 > LINUX > Linux Shell脚本编写基础(2)

Linux Shell脚本编写基础(2)

时间:2015-06-28 00:00 来源:IT猫扑网|http://www.itmop.com/ 作者:网管联盟 我要评论(0)

  5. 引号

  在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。

  1.2 编译SHELL脚本

  #ch#!/bin/sh mod +x filename

  cho *.jpg ∪缓螅梢酝ü淙耄?./filename 来执行您的脚本。

  这将打印出&mail.jpg tux.jpg&的结果。

  引号 (单引号和双引号) 将防止这种通配符扩展:

  #!/bin/sh

  echo &*.jpg&

  echo '*.jpg'

  这将打印&*.jpg& 两次。

  单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。

  #!/bin/sh

  echo $SHELL

  echo &$SHELL&

  echo '$SHELL'

  运行结果为:

  /bin/bash

  /bin/bash

  $SHELL

  最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆:

  echo *.jpg

  echo $SHELL

  这将输出:

  *.jpg

  $SHELL

  6. Here documents

  当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 here documents就不必用echo函数一行行输出。 一个 &Here document& 以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:

  #!/bin/sh

  # we have less than 3 arguments. Print the help text:

  if [ $# -lt 3 ] ; then

  cat <

  ren -- renames a number of files using sed regular expressions

  USAGE: ren 'regexp' 'replacement' files...

  EXAMPLE: rename all *.HTM files in *.html:

  ren 'HTM$' 'html' *.HTM

  HELP

  exit 0

  fi

  OLD=&$1&

  NEW=&$2&

  # The shift command removes one argument from the list of

  # command line arguments.

  shift

  shift

  # $* contains now all the files:

  for file in $*; do

  if [ -f &$file& ] ; then

  newfile=`echo &$file& | sed &s/${OLD}/${NEW}/g&`

  if [ -f &$newfile& ]; then

  echo &ERROR: $newfile exists already&

  else

  echo &renaming $file to $newfile ...&

  mv &$file& &$newfile&

  fi

  fi

  done

  这是一个复杂一些的例子。让我们详细讨论一下。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了我们的目的:得到了旧文件名和新文件名。然后使用mv命令进行重命名。

#p#副标题#e#

  4)函数

  如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:

  functionname()

  {

  # inside the body $1 is the first argument given to the function

  # $2 the second ...

  body

  }

  您需要在每个程序的开始对函数进行声明。

  下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。

  这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。

  #!/bin/sh

  # vim: set sw=4 ts=4 et:

  help()

  {

  cat <

  xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole

  USAGE: xtitlebar [-h] &string_for_titelbar&

  OPTIONS: -h help text

  EXAMPLE: xtitlebar &cvs&

  HELP

  exit 0

  }

  # in case of error or if -h is given we call the function help:

  [ -z &$1& ] && help

  [ &$1& = &-h& ] && help

  # send the escape sequence to change the xterm titelbar:

  echo -e &33]0;$107&

  #

  在脚本中提供帮助是一种很好的编程习惯,这样方便其他用户(和您)使用和理解脚本。

  命令行参数

  我们已经见过$* 和 $1, $2 ... $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。

  有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。

  #!/bin/sh

  help()

  {

  cat <

  This is a generic command line parser demo.

  USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2

  HELP

  exit 0

  }

  while [ -n &$1& ]; do

  case $1 in

  -h) help;shift 1;; # function help is called

  -f) opt_f=1;shift 1;; # variable opt_f is set

  -l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2

  --) shift;break;; # end of options

  -*) echo &error: no such option $1. -h for help&;exit 1;;

  *) break;;

  esac

  done

  echo &opt_f is $opt_f&

  echo &opt_l is $opt_l&

  echo &first arg is $1&

  echo &2nd arg is $2&

  您可以这样运行该脚本:

  cmdparser -l hello -f -- -somefile1 somefile2

  返回的结果是:

  opt_f is 1

  opt_l is hello

  first arg is -somefile1

  2nd arg is somefile2

  这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数.

  第2部分 实例

  现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:

  cp framework.sh myscript

  然后再插入自己的函数。

#p#副标题#e#

  让我们再看两个例子:

  二进制到十进制的转换

  脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:

  #!/bin/sh

  # vim: set sw=4 ts=4 et:

  help()

  {

  cat <

  b2h -- convert binary to decimal

  USAGE: b2h [-h] binarynum

  OPTIONS: -h help text

  EXAMPLE: b2h 111010

  will return 58

  HELP

  exit 0

  }

  error()

  {

  # print an error and exit

  echo &$1&

  exit 1

  }

  lastchar()

  {

  # return the last character of a string in $rval

  if [ -z &$1& ]; then

  # empty string

  rval=&&

  return

  fi

  # wc puts some space behind the output this is why we need sed:

  numofchar=`echo -n &$1& | wc -c | sed 's/ //g' `

  # now cut

关键词标签:Linux,Shell脚本

相关阅读 安装红帽子RedHat Linux9.0操作系统教程 Tomcat9.0如何安装_Tomcat9.0环境变量配置方法 多种操作系统NTP客户端配置 Linux操作系统修改IP Linux实现SCSI硬盘热插拔及在线识别 Linux下用CDMA modem拨号上网

文章评论
发表评论

热门文章 安装红帽子RedHat Linux9.0操作系统教程 安装红帽子RedHat Linux9.0操作系统教程 Linux服务器:设计高性能网站架构-LLMP Linux服务器:设计高性能网站架构-LLMP 使用Clonezilla迁移到虚拟Linux环境 使用Clonezilla迁移到虚拟Linux环境 Linux上的MRTG流量监控中心 Linux上的MRTG流量监控中心 Linux 双网卡绑定一个IP原理及实现 Linux 双网卡绑定一个IP原理及实现 linux和windows等系统远程控制ubuntu桌面 linux和windows等系统远程控制ubuntu桌面

相关下载

人气排行 Linux下获取CPUID、硬盘序列号与MAC地址 dmidecode命令查看内存型号 linux tc实现ip流量限制 安装红帽子RedHat Linux9.0操作系统教程 linux下解压rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 关机、重启、注销 命令 查看linux服务器硬盘IO读写负载 linux命令行浏览器的使用方法 Linux NFS服务固定端口及防火墙配置 U盘安装Ubuntu 10.04 Linux清除用户登录记录和命令历史方法