【问题标题】:How to create a flag with getopts to run a command如何使用 getopts 创建标志以运行命令
【发布时间】:2012-07-24 11:45:11
【问题描述】:

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

检查安装="" 而 getopts ":d" 选择 做 案例“$ opt”在 d) CHECKMOUNT="true" ;; 用法 >&2 1号出口;; 经社理事会 完毕 转移`expr $OPTIND-1` FS_TO_CHECK="/dev" 如果 [ "$CHECKMOUNT" = "true" ] 然后 如果猫 /proc/mounts | grep $FS_TO_CHECK > /dev/null;然后 # 文件系统已挂载 别的 # 文件系统没有挂载 菲 菲

【问题讨论】:

标签: bash shell getopts


【解决方案1】:

您的脚本有很多问题。

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

  • While 不是 bash 控制语句,它是 while。案例很重要
  • 空格很重要if ["$CHECKMOUNT"= "true"] 不起作用,应该会导致错误消息。括号和= 周围需要空格,例如:if [ "$CHECKMOUNT" = "true" ]
  • 您对getopts 的使用不正确,我猜您在复制示例时打错了:While getopts :d: opt 应该是:while getopts ":d" opt
  • 您对shift 的使用不正确。这应该会导致错误消息。如果您需要转移 OPTIND,请将其更改为:shift $((OPTIND-1))
  • 纯文本unknocn 标志 看起来像是注释,在它前面加上#,否则在使用未知选项时会出错。
  • 没有usage 函数。定义一个,或将 \?) 案例中的 usage 更改为 echo 并附上使用说明。

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

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

【讨论】:

  • 谢谢,但我的脚本中有多个选项,所以我无法使用您提供的内容。还有你注意到的点 - 我修复了这些但仍然没有运气
  • 你现在看到了什么问题?很可能你仍然有语法错误
  • usage 调用之前,您还缺少*) 大小写标签。而且您仍然有 Cat 的无用用法(请参阅上一个问题)。
  • 那仍然不能解决我的问题,我只需要知道 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 是否正确。或者如果我通过正确。
  • 您是否从脚本中复制了该命令?因为您仍然有空格问题:` [ "$CHECKMOUNT "="true" ]` 是错误的。看我的回答:= 周围需要空格,CHECKMOUNT 后面没有空格:if [ "$CHECKMOUNT" = "true"]
猜你喜欢
  • 1970-01-01
  • 2017-01-05
  • 2020-08-19
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多