shell脚本在不传递任何必需参数的情况下执

时间:2012-07-30 03:20:26

标签: bash shell

我需要帮助找出我的脚本中的一个问题,选项(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))

2 个答案:

答案 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