1

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

2 回答 2

1

由于选项前面有一个冒号,因此有责任处理错误情况。

来自help getopts

如果 OPTSTRING 的第一个字符是冒号,getopts 使用静默错误报告。在此模式下,不会打印任何错误消息。如果看到无效选项,getopts 会将找到的选项字符放入 OPTARG。如果没有找到所需的参数,getopts 会在 NAME 中放置一个 ':' 并将 OPTARG 设置为找到的选项字符。

您必须处理$optioncontains的情况:

于 2012-07-30T03:34:05.327 回答
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 
于 2012-07-30T04:03:53.870 回答