zoukankan      html  css  js  c++  java
  • linux shell编程指南第二十章------向脚本传递参数

    前面已经讲到如何使用特定变量$ 1 . . $ 9向脚本传递参数。$ #用于统计传递参数的个数。可

    以创建一个u s a g e语句,需要时可通知用户怎样以适当的调用参数调用脚本或函数。

    简单地说,下述脚本框架控制参数开始与停止。脚本需要两个参数,如果没有输入两个
    参数,那么产生一个u s a g e语句。注意这里使用c a s e语句处理输入脚本的不同参数。

    [root@localhost huangcd]# cat opt
    #!/bin/bash
    usage()
    {
      echo "usage:`basename $0` start|stop process name"
    }
    OPT=$1
    PROCESSID=$2
    if [ $# -ne 2 ]
    then
      usage
      exit1
    fi
    case $OPT in
      start|Start)
      echo "Starting..$PROCESSID"
      ;;
      stop|Stop)
      echo "Stoping..$PROCESSID"
      ;;
      *) usage
      ;;
    esac
    [root@localhost huangcd]# opt start named
    Starting..named

    任何U N I X或L I N U X命令均接受一般格式:
    命令选项文件

    选项部分最多可包含1 2个不同的值。上述脚本中,如果必须控制不同的命令选项,就要
    加入大量脚本。这里只控制两个选项:开始和停止。
    幸运的是s h e l l提供s h i f t命令以帮助偏移选项,使用s h i f t可以去除只使用$ 1到$ 9传递参数的
    限制。

    向脚本传递参数时,有时需要将每一个参数偏移以处理选项,这就是s h i f t命令的功能。
    它每次将参数位置向左偏移一位,下面用一段简单脚本详述其功能。脚本使用w h i l e循环反馈
    所有传递到脚本的参数。

    [root@localhost huangcd]# opt2 huang cheng du
    huang
    0
    cheng
    0
    du
    0
    [root@localhost huangcd]# cat opt2
    #!/bin/bash
    loop=0
    while [ $# -ne 0 ]
    do
      echo $1
      echo $loop
      shift
    done

    虽然还没有讲e v a l命令,如果需要知道命令行中输入的最后一个参数(通常是一个文件名),
    可以有两种选择:使用命令eval echo $$#;使用s h i f t命令:shift 'expr $# -2'。

    [root@localhost huangcd]# opt2 huang cheng du
    huang
    du
    cheng
    du
    du
    du
    [root@localhost huangcd]# cat opt2
    #!/bin/bash
    loop=0
    while [ $# -ne 0 ]
    do
      echo $1
      eval echo $$#
      shift
    done


    g e t o p t s可以编写脚本,使控制多个命令行参数更加容易。g e t o p t s用于形成命令行处理标
    准形式。原则上讲,脚本应具有确认带有多个选项的命令文件标准格式的能力。

    通过例子可以更好地理解g e t o p t s。以下g e t o p t s脚本接受下列选项或参数。
    • a 设置变量A L L为t r u e。
    • h 设置变量H E L P为t r u e。

    • f 设置变量F I L E为t r u e。
    • v 设置变量V E R B O S E为t r u e。
    对于所有变量设置,一般总假定其初始状态为f a l s e:

    g e t o p t s一般格式为:
    getopts option_string variable
    在上述例子中使用脚本:
    while getopts ahfgv OPTION
    可以看出w h i l e循环用于读取命令行,o p t i o n s t r i n g为指定的5个选项(- a,- h,- f,- g,- v),
    脚本中v a r i a b l e为O P T I O N。注意这里并没有用连字符指定每一单个选项。

    g e t o p t s读取o p t i o n s t r i n g,获知脚本中使用了有效选项。
    g e t o p t s查看所有以连字符开头的参数,将其视为选项,如果输入选项,将把这与
    o p t i o n s t r i n g对比,如果匹配发现,变量设置为O P T I O N,如果未发现匹配字符,变量能够设
    置为?。重复此处理过程直到选项输入完毕。
    g e t o p t s接收完所有参数后,返回非零状态,意即参数传递成功,变量O P T I O N保存最后处
    理参数,一会儿就可以看出处理过程中这样做的好处。

    [root@localhost huangcd]# getopt1 -a -h -p
    ALL is true
    HLEP is true
    /home/huangcd/getopt1: illegal option -- p
    [root@localhost huangcd]# getopt1 -a -g
    ALL is true
    [root@localhost huangcd]# cat getopt1
    #!/bin/bash
    ALL=false
    HELP=false
    FILE=false
    VERBOSE=false


    while getopts ahfgv OPTION
    do
      case $OPTION in
      a) ALL=true
         echo "ALL is $ALL"
         ;;
      h) HELP=true
         echo "HLEP is $HELP"
         ;;
      f) FILE=true
         echo "FILE is $FILE"
         ;;
      v) VERBOSE=true
         echo "VERBOSE is $VERBOSE"
         ;;
      esac
    done


    有时有必要在脚本中指定命令行选项取值。g e t o p t s 为此提供了一种方式,即在
    o p t i o n s t r i n g中将一个冒号放在选项后。例如:
    getopts ahfvc: OPTION
    上面一行脚本指出,选项a、h、f、v可以不加实际值进行传递,而选项c必须取值。使用
    选项取值时,必须使用变量O P TA R G保存该值。如果试图不取值传递此选项,会返回一个错
    误信息。错误信息提示并不明确,因此可以用自己的反馈信息屏蔽它,方法如下:
    将冒号放在o p t i o n s t r i n g开始部分。
    while getopts :ahfgvc: OPTION
    在c a s e语句里使用?创建一可用语句捕获错误。

    [root@localhost huangcd]# cat getopt1
    #!/bin/bash
    ALL=false
    HELP=false
    FILE=false
    VERBOSE=false


    while getopts ahfgv OPTION
    do
      case $OPTION in
      a) ALL=true
         echo "ALL is $ALL"
         ;;
      h) HELP=true
         echo "HLEP is $HELP"
         ;;
      f) FILE=true
         echo "FILE is $FILE"
         ;;
      v) VERBOSE=true
         echo "VERBOSE is $VERBOSE"
         ;;
      esac
    done


    [root@localhost huangcd]# vim getopt1
    [root@localhost huangcd]# cat getopt1 
    #!/bin/bash
    ALL=false
    HELP=false
    FILE=false
    VERBOSE=false
    COPIES=0


    while getopts :ahfgvc: OPTION
    do
      case $OPTION in
      a) ALL=true
         echo "ALL is $ALL"
         ;;
      h) HELP=true
         echo "HLEP is $HELP"
         ;;
      f) FILE=true
         echo "FILE is $FILE"
         ;;
      v) VERBOSE=true
         echo "VERBOSE is $VERBOSE"
         ;;
      c) COPIES=$OPTARG
         echo "COPIES is $COPIES"

         ;;
      ?)
         echo "`basename $0` -[a h f v] -[c value] file" > &2
         ;;
      esac
    done

    运行上述脚本,选项- c不赋值,将返回错误,但显示的是脚本语句中的反馈信息:


    [root@localhost huangcd]# getopt1 -ah -c 3
    ALL is true
    HLEP is true
    COPIES is 3
    [root@localhost huangcd]# getopt1 -ah -c
    ALL is true
    HLEP is true

    [root@localhost huangcd]# getopt1 -aho
    ALL is true
    HLEP is true
    getopt1 -[a h f v] -[c value] file


    在脚本中指定命令行选项时,最好使其命名规则与U N I X或L I N U X一致。下面是一些选项
    及其含义的列表。

    选项含义
    - a 扩展
    - c 计数、拷贝
    - d 目录、设备
    - e 执行
    - f 文件名、强制
    - h 帮助
    - i 忽略状态
    - l 注册文件
    - o 完整输出
    - q 退出
    - p 路径
    -v 显示方式或版本

  • 相关阅读:
    Java——static
    Java——package与import
    Java——方法重写
    Java——super
    Java——类的继承、访问控制
    Java——API文档
    Java——对象转型
    Java——动态绑定和多态
    Java——抽象类
    redis在linux上的安装和配置
  • 原文地址:https://www.cnblogs.com/riasky/p/3473262.html
Copyright © 2011-2022 走看看