Getopt接受特殊字符作为值



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*@7Xw8e5@.a --INITIALIZE=test --SPTENT=beating
++ USERNAME: sujithsujtih
++ <><><>< test
++ beating
++ PWD: @k2B0R*@7Xw8e5@.a

AFIK,对可以作为选项传递的字符没有限制(可能NUL字符除外(。我不知道特殊字符是什么意思,但在getopt有机会看到它之前,请小心调用shell对输入做了什么,以及之后如何使用该值。例如,当你在你的代码

--SPPWD=I+RFzwpXm13Jn==@k2B0R*@7Xw8e5@.a

这本质上是不安全的,因为shell将尝试扩展glob字符*。在存在与该字符串匹配的文件名的情况下(诚然不太可能(,您的程序将看到扩展的文件名,而不是星号。因此,你最好把它写成

--SPPWD="I+RFzwpXm13Jn==@k2B0R*@7Xw8e5@.a"

"--SPPWD=I+RFzwpXm13Jn==@k2B0R*@7Xw8e5@.a"

这同样适用于使用解析的选项。当你这样做时,就像在你的代码中一样,

echo ++ PWD: $SPPWD

通配符扩展可能发生在SPPWD的内容上,您最好编写

echo "++ PWD: $SPPWD"

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

最新更新