在bash中检查命令行标志的正确方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在bash中检查命令行标志的正确方法相关的知识,希望对你有一定的参考价值。
在脚本中间,我想检查命令行上是否传递了给定的标志。以下是我想要的,但看起来很难看:
if echo $* | grep -e "--flag" -q
then
echo ">>>> Running with flag"
else
echo ">>>> Running without flag"
fi
有没有更好的办法?
注意:我明确地不想列出switch / getopt中的所有标志。 (在这种情况下,任何这样的东西都会变成完整脚本的一半或更多。而且if的主体也只是设置了一组变量)
答案
替代你正在做的事情:
if [[ $* == *--flag* ]]
另见BashFAQ/035。
注意:这也将匹配
--flags-off
,因为它是一个简单的子字符串检查。
另一答案
我通常会在案例陈述中看到这一点。以下是git-repack脚本的摘录:
while test $# != 0
do
case "$1" in
-n) no_update_info=t ;;
-a) all_into_one=t ;;
-A) all_into_one=t
unpack_unreachable=--unpack-unreachable ;;
-d) remove_redundant=t ;;
-q) GIT_QUIET=t ;;
-f) no_reuse=--no-reuse-object ;;
-l) local=--local ;;
--max-pack-size|--window|--window-memory|--depth)
extra="$extra $1=$2"; shift ;;
--) shift; break;;
*) usage ;;
esac
shift
done
请注意,这允许您检查短标志和长标志。在这种情况下,使用extra
变量构建其他选项。
另一答案
您可以在bash中使用getopt关键字。
来自http://aplawrence.com/Unix/getopts.html:
getopt的
这是一个独立的可执行文件,已经存在很长时间了。较旧的版本缺乏处理引用参数的能力(foo“这将无效”c)和版本可以,笨拙地这样做。如果您运行的是最近的Linux版本,那么“getopt”可以做到这一点; SCO OSR5,Mac OS X 10.2.6和FreeBSD 4.4的旧版本没有。
这个迷你脚本中显示了“getopt”的简单使用:
#!/bin/bash
echo "Before getopt"
for i
do
echo $i
done
args=`getopt abc:d $*`
set -- $args
echo "After getopt"
for i
do
echo "-->$i"
done
以上是关于在bash中检查命令行标志的正确方法的主要内容,如果未能解决你的问题,请参考以下文章