Getopt接受特殊字符作为值

问题描述 投票:0回答:1

Getopts不接受特殊字符作为值,接受特殊字符作为值的输入的更好选择是什么?当我传递正常值时,输出将被打印,但是当我尝试传递特殊字符时,输出将被忽略。

optspec=":hv-:"
while getopts "$optspec" optchar; do

    case "${optchar}" in
        -)
            case "${OPTARG}" in
                SPUN=*)
                    SPUN=${OPTARG##*=}
                    ;;
                SPPWD=*)
                    SPPWD=${OPTARG##*=}
                    ;;
                SPTENT=*)
                    SPTENT=${OPTARG##*=}
                    ;;
                SECURITY_PROTOCOL=*)
                    SECURITY_PROTOCOL=${OPTARG##*=}
                    ;;
                SSL_TRUSTSTORE_LOCATION=*)
                    SSL_TRUSTSTORE_LOCATION=${OPTARG##*=}
                    ;;
                SSL_TRUSTSTORE_PASSWORD=*)
                    SSL_TRUSTSTORE_PASSWORD=${OPTARG##*=}
                    ;;
                INITIALIZE=*)
                    INITIALIZE=${OPTARG##*=}
                    ;;
                *)
                    echo "Unknown option --${OPTARG}" >&2
                    exit 1
                    ;;
            esac;;
        h)
            print_usage
            exit
            ;;
        v)
            echo "Parsing option: '-${optchar}'" >&2
            ;;
        *)
            if [ "$OPTERR" != 1 ] || [ "${optspec:0:1}" = ":" ]; then
                echo "Non-option argument: '-${OPTARG}'" >&2
            fi
            ;;
    esac
done

echo ++ USERNAME: $SPUN
echo ++ "<><><>< $INITIALIZE"
echo ++ "$SPTENT"
echo ++ PWD: $SPPWD

deploy.sh --SPUN=sujithsujtih --SPPWD=sujithpwd= --INITIALIZE=test --SPTENT=beating
++ USERNAME: sujithsujtih
++ <><><>< test
++ beating
++ PWD:

deploy.sh --SPUN=sujithsujtih --SPPWD=I+RFzwpXm13Jn==@k2B0R*@[email protected] --INITIALIZE=test --SPTENT=beating
++ USERNAME: sujithsujtih
++ <><><>< test
++ beating
++ PWD: @k2B0R*@[email protected]
bash shell sh
1个回答
0
投票

AFIK,对于可以作为选项传递的字符没有限制(可能是NUL字符除外)。我不知道special字符的含义,但是在getopt有机会看到它之前,请小心调用shell对输入所做的操作,以及以后如何使用该值。例如,当您在代码中进行操作时

--SPPWD=I+RFzwpXm13Jn==@k2B0R*@[email protected]

这本质上是不安全的,因为外壳程序将尝试扩展glob字符*。如果文件名与该字符串匹配存在(这是不太可能的),则程序将看到该扩展文件名而不是星号。因此,您最好将其写为

--SPPWD="I+RFzwpXm13Jn==@k2B0R*@[email protected]"

"--SPPWD=I+RFzwpXm13Jn==@k2B0R*@[email protected]"

使用解析选项时也是如此。当您这样做时,就像在代码中一样,

echo ++ PWD: $SPPWD

SPPWD的内容可能会出现通配符扩展,您最好写上

echo "++ PWD: $SPPWD"

但这是bash编程的一般原则,与getopt无关。

© www.soinside.com 2019 - 2024. All rights reserved.