Linux 获取参数的Shell getops
我有一个脚本,它应该作为以下两个脚本之一运行:Linux 获取参数的Shell getops,linux,bash,shell,debian,Linux,Bash,Shell,Debian,我有一个脚本,它应该作为以下两个脚本之一运行: script.sh -t TYPE script.sh -t TYPE -f FILE 如果它在没有-t标志的情况下运行,我希望它出错并退出 如果它是使用-t标志运行的,我想获取该值并将其存储在 变量名为“$TYPE”并打印“JUST$TYPE” 如果它使用-f标志运行,我希望它获取值并将其存储在一个名为 “$FILE”并打印“$TYPE和$FILE” 从这里和互联网上的信息和教程来看,这是我能得到的最接近的。有人能帮我把第二个条件放进现有的
script.sh -t TYPE
script.sh -t TYPE -f FILE
- 如果它在没有-t标志的情况下运行,我希望它出错并退出李>
- 如果它是使用-t标志运行的,我想获取该值并将其存储在 变量名为“$TYPE”并打印“JUST$TYPE”
- 如果它使用-f标志运行,我希望它获取值并将其存储在一个名为 “$FILE”并打印“$TYPE和$FILE”
while getopts ":t:" opt; do
case $opt in
a)
echo "JUST $OPTARG" >&2
;;
\?)
echo "Error - Invalid type argument" >&2
exit 1
;;
:)
echo "Error - No type argument" >&2
exit 1
;;
esac
done
看看这个:
TYPE=""
FILE=""
while getopts "t:f:" opt; do
case $opt in
t) TYPE="$OPTARG"
;;
f) FILE="$OPTARG"
;;
esac
done
if [ -z "$TYPE" ]; then
echo "No -t. Bye."
exit 1 # error
else
if [ -n "$FILE" ]; then
echo "$TYPE and $FILE"
else
echo JUST $TYPE
fi
fi
我想您可能会对如何处理命令行参数感到困惑 常见的方法是,所有参数的处理都先于程序/脚本的实际作业 此外(与
getopts
相关),如果选项附加了冒号,则表示该选项应具有参数
你的案例
陈述看起来也人满为患。你不需要测试冒号和问号。整个测试可以放在while
循环之后
我会这样做
#!/bin/bash
unset TYPE
unset FILE
#uncomment if you want getopts to be silent
#OPTERR=0
while getopts "t:f:" opt; do
case $opt in
t)
TYPE=$OPTARG
echo "JUST $OPTARG"
;;
f)
FILE=$OPTARG
;;
esac
done
if ! test "$TYPE" ; then
echo "-t is obligatory"
exit 1
fi
if test "$TYPE" && test "$FILE" ; then
echo "$TYPE and $FILE"
fi
非常感谢你的帮助。这对#有用吗/bin/sh也是吗?我不知道
/bin/sh
后面是什么shell,但我会尝试一下。严格来说,不是。如果shell不支持getopts
命令,可以使用一个外部程序getopt
,来处理选项。