如何使用 getopts 创建标志以运行命令

Posted

技术标签:

【中文标题】如何使用 getopts 创建标志以运行命令【英文标题】:How to create a flag with getopts to run a command 【发布时间】: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;然后 # 文件系统已挂载 别的 # 文件系统没有挂载 菲 菲

【问题讨论】:

以下是来自 Freenode 上#bash 频道的一些有用参考资料:wiki.bash-hackers.org/howto/getopts_tutorial 和 mywiki.wooledge.org/BashFAQ/035 【参考方案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"]

以上是关于如何使用 getopts 创建标志以运行命令的主要内容,如果未能解决你的问题,请参考以下文章

使用 getopt() 进行 C 编程:给出命令行标志标准

在 Bash 中使用 getopts 检索单个选项的多个参数

如何使用纱线离线标志使用 ng 命令创建新的 Angular 应用程序?

shell getopts命令

getopts

Linux中getopt详解