您好我试图找到一种方法,让getopts可以使用非预期的可选参数
我有一个带有可选参数的脚本
script.sh [-a] [-b] [-c | -d] file
我使用-a ..- d喜欢这个
while geopts abc:abd opt
do
case $opt in
a) do this ;;
b) do this ;;
...
..等等
我想这样做它可以在没有这些参数的情况下工作,所以我可以像这样运行它
script.sh file
有没有办法制作新案例选项,或者我需要以其他方式执行此操作,感谢所有帮助,我是bash的初学者。
答案 0 :(得分:1)
我之前做过这样的事情:
declare -A have=([a]=false [b]=false [c]=false [d]=false)
while geopts :abcd opt; do
case $opt in
a) have[a]=true ;;
b) have[b]=true ;;
c) have[c]=true ;;
d) have[d]=true ;;
?) echo "illegal option: -$OPTARG"; exit 1;;
esac
done
shift $((OPTIND-1))
if ${have[c]} && ${have[d]}; then
echo "cannot give both -c and -d"
exit 1
fi
${have[a]} && do_a_stuff
${have[b]} && do_b_stuff
...
那个案例陈述是一个非常令人震惊的剪辑编程:加强它:
while geopts :abcd opt; do
case $opt in
a|b|c|d) have[$opt]=true ;;
?) echo "illegal option: -$OPTARG"; exit 1;;
esac
done
答案 1 :(得分:1)
我有以下测试脚本:
#! /bin/bash
USAGE="test.sh [-a] [-b] [-c | -d ]"
while getopts :abcd option
do
case $option in
a) OPT_A=1;;
b) OPT_B=1;;
c) OPT_C=1;;
d) OPT_D=1;;
*)
echo "$OPTARG is not a valid option."
echo "$USAGE"
exit 2;;
esac
done
shift $((OPTIND-1))
if [[ $OPT_C && $OPT_D ]]
then
echo "That's a no-no using options c and d together"
echo "$USAGE"
exit 2
fi
echo "The following options were set"
[[ $OPT_A ]] && echo " Option A was set"
[[ $OPT_B ]] && echo " Option B was set"
[[ $OPT_C ]] && echo " Option C was set"
[[ $OPT_D ]] && echo " Option D was set"
echo "And the file name is $1"
它将显示已设置的选项(以及哪些选项不是)。它会进行测试,以确保-c
和-d
不会一起使用。
不是100%肯定你要求的。但是,您可以看到,在我的case
语句中,我不是说执行此操作,而是仅设置显示已选择或未选择的选项的变量。这本身就解决了你的问题。