如何使用 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 创建标志以运行命令的主要内容,如果未能解决你的问题,请参考以下文章
在 Bash 中使用 getopts 检索单个选项的多个参数