在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中检查命令行标志的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中,选项标志值如何存储在变量中? [复制]

在 Bash 中解析命令行参数的最佳方法是啥?

在 C# 中处理命令行选项的最佳方法 [重复]

在 Xcode 中使用 bash 编译标志

Swift:iOS 部署目标命令行标志

持续集成检查格式