如何使用getopts创建一个标志来运行命令

时间:2012-07-25 23:06:47

标签: bash shell getopts

我需要帮助我的getopts,我希望只有在我传递一个标志(在这种情况下为-d)时才能运行此命令(mount命令)。 下面的输出是我的脚本,但它似乎不起作用。

CHECKMOUNT=" "

while getopts ":d" opt
do
  case "$opt" in

  d) CHECKMOUNT="true" ;;

      usage >&2
      exit 1;;
    esac
   done
  shift `expr $OPTIND-1`

FS_TO_CHECK="/dev" 

if [ "$CHECKMOUNT" = "true" ] 
then
  if cat /proc/mounts | grep $FS_TO_CHECK > /dev/null; then
   # Filesystem is mounted
else
   # Filesystem is not mounted
  fi
fi

1 个答案:

答案 0 :(得分:1)

您的脚本存在许多问题。

以下是使其正常工作的最小修复列表:

  • While不是bash控制语句,而是while。案例很重要
  • 空格很重要if ["$CHECKMOUNT"= "true"]不起作用,应该导致错误消息。您需要在括号周围和=周围留出空格,如下所示:if [ "$CHECKMOUNT" = "true" ]
  • 您对getopts的使用不正确,我猜您错误地复制了一个示例:While getopts :d: opt应该是:while getopts ":d" opt
  • 您对shift的使用不正确。这应该会导致错误消息。如果您需要转移shift $((OPTIND-1)),请将其更改为:OPTIND
  • 裸文 unknocn flag 似乎是一个评论,在#之前,否则在使用未知选项时会出错。
  • 没有usage功能。使用使用说明定义一个,或将usage案例中的\?)更改为echo

最后,如果您的脚本只需要一个可选参数,您也可以自己处理它而不是使用getopt - 脚本的第一个参数存储在特殊变量$1中:< / p>

if [ "$1" = "-d" ]; then
    CHECKMOUNT="true"
elif [ "$1" != "" ]; then
    usage >&2
    exit 1
fi