我的 shell 输入应遵循以下签名。
myscript.sh var1 var2 [-o var3] [-r var4].
-o 和 -r 是可选输入,这些选项可以出现在任何位置(在 var1 和 var 2 之间或在开始/结束处),但如果指定了 var 3,则 var3 将始终在 var4 之前。 var1 也将在 var 2 之前。
#!/bin/bash
case "$#" in
([01]) echo "Usage: $0 var1 var2 [-o val3] [-r val4]" >&2; exit 1;;
esac
VAR1="$1"
VAR2="$2"
VAR3=
VAR4=
while getopts ":o:r:" opt; do
case $opt in
o)
VAR3=$OPTARG
;;
r)
VAR4=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
shift $(( OPTIND - 1 ))
if [ -z "${VAR3+xxx}" ] && [ -z "${VAR4+xxx}" ];
then
echo $1 $2;
elif [ -z "${VAR3+xxx}" ];
then
echo $1 $2 $VAR4;
elif [ -z "${VAR4+xxx}" ];
then
echo $1 $2 $VAR3;
else
echo $1 $2 $VAR3 $VAR4;
fi
如何处理可选参数在 var1 和 var2 之间的情况
最佳答案
您的调用约定与“选项和参数优先”的经典调用约定相冲突。因此,您需要执行以下操作:
case "$#" in
([01]) echo "Usage: $0 var1 var2 [-o val1] [-r val2]" >&2; exit 1;;
esac
VAR1="$1"
VAR2="$2"
shift 2
# Now use your getopts loop...
关于linux - 难以解析输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073658/