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会把所有未定义的选项统一输出成问号;
     
  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/hancq/p/5091510.html
Copyright © 2011-2022 走看看