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会把所有未定义的选项统一输出成问号;
 
原文地址:https://www.cnblogs.com/hancq/p/5091510.html