zoukankan      html  css  js  c++  java
  • shell脚本编程-处理命令行参数

    1、命令行参数

    (1)读取参数
        bash shell使用位置参数的特殊变量记录命令行参数,$0是程序名,$1~$9依次为输入参数;
        如果脚本需要多余9个变量,需要将变量数字加花括号,如${10};
        命令行输入的参数需要以空格分隔,当空格作为参数的一部分时可以使用引号分开;
        在脚本中对命令行参数进行处理时需要对参数进行有效性判断,如:
    1     $ cat test
    2     #!/bin/bash
    3     #test param
    4     if [ -n "$1" ]; then
    5         echo Nice to meet $1
    6     else
    7         echo "no paran input"
    8     fi
    (2)读取程序名
        可以使用$0获取命令行启动的程序的名字;
        当传给$0变量的字符串是整个脚本路径时,$0变量则是整个路径,而不仅仅是程序名;
        使用basename命令可以获取程序名而不包括路径,如:
      name=`basename $0`
    (3)参数计数
        $#变量保存了执行脚本时命令行输入参数的个数,可以在脚本的任何地方访问$#变量的值;
        可以通过$#变量访问命令行的最后一个参数:${!#} —— 由于在花括号内不能使用美元符,可以使用叹号替换;
    1     $ cat test
    2     #!/bin/bash
    3     # test $#
    4     params=$#
    5     echo the last param is $params
    6     echo the last param is ${!#}
    7     $ ./test 1 2 3 4 5
    8     the last param is 5
    9     the last param is 5
    (4)获取所有的参数
        可以通过 $#变量获取命令行参数的个数,依次对所有参数进行处理;
        $*和$@变量,提供了对所有参数的快速访问;
        $*变量会将所有参数当做单个参数,而$@变量会单独处理每个参数,如:
     1     $ cat test
     2     #!/bin/bash
     3     # test $* and $@
     4     echo "$* is $*"
     5     echo "$@ is $@"
     6     count=1
     7     for param in "$*"; do
     8         echo "$* param #$count=$param"
     9         count=$[ $count + 1 ]
    10     done
    11     count=1
    12     for param in "$*"; do
    13         echo "$* param #$count=$param"
    14         count=$[ $count + 1 ]
    15     done
    16     $ ./test a b c
    17     $* is a b c
    18     $@ is a b c
    19     $* param #1=a b c
    20     $@ param #1=a
    21     $@ param #2=b
    22     $@ param #3=c

    2、参数处理

    (1)移动变量
        shift命令可以用来移动命令行参数。
        默认情况下,shift命令会将命令行参数减一。$n的值依次递减,$1的值会被删除;
        使用shift时,$0的值不改变;
        可以使用shift n 命令修改每次移动的位数;
        注意,在使用shift命令时,一旦参数被移除后,不可恢复。
    (2)使用getopt命令处理选项
        选项(options)是只命令行参数中单破折号后面的单个字母;
        getopt命令可以用来处理命令行选项和参数,格式:
      getopt optstring options params
        optstring定义了命令行有效的选项字母,和那些选项需要参数值(在选项后加冒号表示);
        例如:
      $getopt ab:c -a -b test1 -c test2 test3
      -a -b test1 -c -- test2 test3
        使用--将选项和非选项自带的参数分开;
        如果定义了不在optstring的选项,getopt命令会产生一条错误,-p选项可以忽略错误消息;
        在脚本中使用getopt命令,可以使用set命令,set命令的--选项可以将命令行参数替换成set命令的命令行参数;
        $cat test.sh
        #!/bin/bash
        # extracting command line options and values with getopt
        set -- `getopt -q ab:c "$@"`
        while [ -n "$1" ]; do
            case "$1" in
            -a) echo "find -a option" ;;
            -b) echo "find -b option,and value is $2" 
                shift ;;
            -c) echo "find -c option" ;;
            --) shift
                break ;;
            *) echo "$1 is not a option"
            esac
            shift
        done
        count=1
        for param in "$@"; do 
            echo "parameter #$count: $param"
            count=$[ $count + 1 ]
        done
        $ ./test.sh -a -b 111 -c 222 333
        find -a option
        find -b option,and value is '111'
        find -c option
        parameter #1: '222'
        parameter #2: '333'
    (3)getopts命令
        getopt命令可以将命令行上的所有选项和参数处理后只生成一个输出;
        getopts命令每次调用时只处理一个命令行上检测的参数,处理完所有的参数后,它会退出并返回一个大于0的状态;
        格式:   
      getopts optstring variable
        optstring和getopt命令基本一致,需要去掉错误提示时,只需要在optstring前加一个冒号;
        getopts将当前参数保存在variable中;
        getopts会用到两个环境变量,如果选项需要跟一个参数,OPTARG环境变量保存这个参数;OPTIND环境变量保存了参数列表中getopts正在处理的参数位置;
     1     $ cat test.sh
     2     #!/bin/bash
     3     # processing options and parameters with getopts
     4     while getopts :ab:cd opt ; do
     5         case "$opt" in
     6             a) echo "find the -a option";;
     7             b) echo "find the -b option, with value $OPTARG";;
     8             c) echo "find the -c option";;
     9             d) echo "find the -d option";;
    10             *) echo "unknown option $opt";;
    11         esac
    12     done
    13     shift $[ $OPTIND - 1 ]
    14     count=1
    15     for param in "$@"; do
    16         echo "parameter $count : $param"
    17         count=$[ $count + 1 ]
    18     done
    19     $ ./getopt.sh -a -btest1 -c test2 test3
    20     find -a option
    21     find -b option,and value is 'test1'
    22     find -c option
    23     parameter #1: 'test2'
    24     parameter #2: 'test3'
        getopts在使用时会移除选项前的单线破折号;
        getopts允许选项和参数拼接在一起使用,不用加空格;
        getopts会把所有未定义的选项统一输出成问号;
     
  • 相关阅读:
    【转发】揭秘Facebook 的系统架构
    【转发】淘宝网架构分享总结
    【转发】淘宝网采用什么技术架构来实现网站高负载的
    【转发】浅析淘宝网首页信息架构的变迁
    【转发】Html5 File Upload with Progress
    (9/18)重学Standford_iOS7开发_动画、自动布局_课程笔记
    (8/18)重学Standford_iOS7开发_协议、block、动画_课程笔记
    (7/18)重学Standford_iOS7开发_视图、绘制、手势识别_课程笔记
    (6/18)重学Standford_iOS7开发_控制器多态性、导航控制器、选项卡栏控制器_课程笔记
    (5/18)重学Standford_iOS7开发_视图控制器生命周期_课程笔记
  • 原文地址:https://www.cnblogs.com/hancq/p/5091510.html
Copyright © 2011-2022 走看看