【Linux】命令行选项和参数处理

Linux下的Shell命令行选项和参数的处理一般可以用getopt、getopts和while-case等方式处理。

简单的while加case

一般选项和参数定义通常是-v后面接一个版本的参数以及-v后面不接参数两种
参考代码
cat parse_args.sh

#!/bin/bash
export VERSION=""
export PPT="NO"

parse_args(){
        echo "start parse_args"
        while [ -n "$1" ]
        do
                case "$1" in
                -v)
                        shift
                        if [ -n "$1" ];then
                                export VERSION="$1"
                        else
                                echo "ERROR:VERSION is empty"
                                exit 1
                        fi
                        shift
                ;;
                -p)
                        export PPT="YES"
                        shift
                ;;
                *)
                        echo "wrong args:$*"
                        exit 1
                ;;
                esac
        done
}

parse_args $@
echo $VERSION
echo $PPT

上述echo格式可以参考另外一篇博文进行标准化输出
https://blog.csdn.net/Sudley/article/details/93914507
上述代码要点介绍:
shift:参数进行左移,$2移到$1,也可加数字shift 2表示参数左移两位$3移到$1。

∗ 和 *和 @的区别:
∗ " 会 把 所 有 位 置 参 数 当 成 一 个 整 体 ( 或 者 说 当 成 一 个 单 词 ) , 如 果 没 有 位 置 参 数 , 则 " *" 会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则" ""“为空,如果有两个位置参数并且IFS为空格时,”$“相当于”$1 2 " 。 " 2"。 " 2""@” 会把所有位置参数当成一个单独的字段,如果没有位置参数(KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲为0),则"@“展开为空(不是空字符串,而是空列表),如果存在一个位置参数,则”$@“相当于” 1 " , 如 果 有 两 个 参 数 , 则 " 1",如果有两个参数,则" 1""@“相当于”$1" " 2 " 等 等 。 一 般 可 以 通 过 用 f o r 循 环 展 开 2"等等。 一般可以通过用for循环展开 2"for*和$@参数来对比他们之间的区别

[root@localhost /home/Sudley]#cat test.sh
#!/bin/bash
for i in "$*"
do
        echo $i
done
echo "############################"
for i in "$@"
do
        echo $i
done
[root@localhost /home/Sudley]#sh test.sh a b c
a b c
############################
a
b
c

while、case组合的选项参数处理优缺点
优点:简单粗暴,用我们已知的while循环和case分支就可以实现选项处理。
缺点:选项出错不感知,比如上述代码我们期待的输入应该是./parse_args.sh -v 2019 -p,但是当输入./parse_args.sh -v -p时也不会出错,此时-p就赋值给了VERSION变量。这样需要通过其他方式来检查我们的参数输入是否符合要求。

getopts

比较直观,一眼看到支持哪些选项,选项后面接:代表需要接参数,参数保存在$OPTARG变量中。

#!/bin/bash
echo $@ |\
while getopts 'a:bcd:e' OPT
do
        case $OPT in
        a)
                echo $OPTARG
        ;;
        b)
                echo "b"
        ;;
        c)
                echo "c"
        ;;
        d)
                dd="$OPTARG"
                echo $dd
        ;;
        e)
                echo "end"
        ;;
        ?)
                echo "unknow option"
                exit 1
        ;;
        esac
done

【Linux】命令行选项和参数处理_第1张图片

你可能感兴趣的:(Linux)