不管参数的顺序如何,都可以将OPTARG用作shell脚本中的变量

时间:2019-07-03 13:05:59

标签: bash sh

假设我有一个像这样的脚本:(我们称它为test.sh)

#!/bin/sh

function php() {
    printf "The rhost is ${RHOST} and the lport is ${LPORT}"
}

while getopts "hr:l:s:" arg; do
    case $arg in
        h)
            printf "Usage\n"
        ;;

        r)
            RHOST=$OPTARG
        ;;

        l)
            LPORT=$OPTARG
        ;;

        s)
            SHELL=$OPTARG

            if [[ "$SHELL" == "php" ]] || [[ "$SHELL" == "PHP" ]] ; then
                php

            fi
       ;;
    esac
done

如果我运行“ test.sh -r 10 -l 4 -s php”之类的脚本

我的脚本将按照我的意愿执行...

但是,如果我将其运行为“ test.sh -s php -r 10 -l 4”

rhost和lport变量永远不会进入php函数。我意识到这是因为它首先被调用。但是,我的问题是,如何编写脚本,以便无论参数运行的顺序如何,我仍然可以使用rhost和lport作为变量?

我也尝试过使用shift,但是我猜这不是答案,或者我将shift命令放在错误的位置。

1 个答案:

答案 0 :(得分:4)

将“ if”逻辑移出开关/案例:

#!/bin/sh
function php() {
    printf "The rhost is ${RHOST} and the lport is ${LPORT}"
}

while getopts "hr:l:s:" arg; do
    case $arg in
        h)
            printf "Usage\n"
        ;;

        r)
            RHOST=$OPTARG
        ;;

        l)
            LPORT=$OPTARG
        ;;

        s)
            SHELL=$OPTARG         
       ;;
    esac    
done

if [[ "$SHELL" == "php" ]] || [[ "$SHELL" == "PHP" ]] 
then
   php
fi