我需要帮助找出我的脚本中的一个问题,选项(c,e,d,f和g)是我脚本中的强制选项,并且在运行我的脚本之前总是隐含它们,否则脚本将不会被执行。现在我添加了一个命令,如果我试图在没有任何必要参数的情况下执行我的脚本,它仍然会执行并退出,我的脚本不应该执行而不传递任何必需的参数但它仍然会执行并退出。我怎样才能解决这个问题?
提前谢谢你,
#!/bin/bash
cont=false
options=':c:d:e:f:g:h:i' # additional option characters go here
while getopts $options option
do
case $option in
c ) cont=true;;
d ) hello="$OPTARG"
e ) hi="$OPTARG"
f ) Fri="$OPTARG"
g ) Sat="$OPTARG"
h ) SUN="$OPTARG"
i ) ....so on
# more option processing can go here
esac
done
shift $(($OPTIND - 1))
答案 0 :(得分:1)
由于选项前面有冒号, 负责处理错误情况。
来自help getopts
:
如果是第一个角色 OPTSTRING是一个冒号,getopts使用无提示错误报告。在 此模式下,不会打印任何错误消息。如果选项无效 看到,getopts将选项字符放入OPTARG中。如果一个 找不到必需的参数,getopts将':'放入NAME和 将OPTARG设置为找到的选项字符。
您必须处理$option
包含:
的情况。
答案 1 :(得分:1)
使用名为mandatory
的数组包含必需的选项并将数组元素设置为-
以获取给定选项,下面的代码报告了未指定的强制选项的错误:
mandatory=(c d e f g)
options=':c:d:e:f:g:h:i'
while getopts $options option
do
for ((i = 0 ; i < ${#mandatory[@]} ; i++ )); do
[[ $option == ${mandatory[$i]} ]] && mandatory[$i]="-"
done
case $option in
c ) echo c; cont=true;;
d ) hello="$OPTARG";;
e ) hi="1"
esac
done
for ((i = 0 ; i < ${#mandatory[@]} ; i++ )); do
if [[ ${mandatory[$i]} != '-' ]]; then
echo "option ${mandatory[$i]} was not given"
exit 1
fi
done
if cat /proc/mounts | grep /dev ; then echo "mount exists
else
echo "mount doesn't exist"
exit ;
fi