检查 Bash 脚本中的任何参数是否与字符串匹配

检查 Bash 脚本中的任何参数是否与字符串匹配

我正在尝试编写一个脚本,用于检查传递给 bash 脚本的任何参数是否与字符串匹配。我现在的设置方式是

if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]

但可能有大量的参数,所以我想知道是否有更好的方法来做到这一点?

谢谢

编辑:我尝试了这段代码,并使用选项 -disableVenusBld 调用了脚本,但它仍然打印出“正在开始构建”。我做错了什么吗?提前致谢!

while [ $# -ne 0 ]
do
    arg="$1"
    case "$arg" in
        -disableVenusBld)
            disableVenusBld=true
            ;;
        -disableCopperBld)
            disableCopperBld=true
            ;;
        -disableTest)
            disableTest=true
            ;;
        -disableUpdate)
            disableUpdate=true
            ;;
        *)
            nothing="true"
            ;;
    esac
    shift
done

if [ "$disableVenusBld" != true ]; then
    echo "Starting build"
fi

答案1

看起来您正在 shell 脚本中进行选项处理。以下是其惯用语:

#! /bin/sh -

# idiomatic parameter and option handling in sh
while test $# -gt 0
do
    case "$1" in
        --opt1) echo "option 1"
            ;;
        --opt2) echo "option 2"
            ;;
        --*) echo "bad option $1"
            ;;
        *) echo "argument $1"
            ;;
    esac
    shift
done

exit 0

(缩进 有几个约定;;,并且有些 shell 允许您将选项指定为(--opt1),以帮助括号匹配,但这是基本思想)

答案2

这对我来说很管用。它完全按照你的要求做了,仅此而已(没有选项处理)。这到底是好是坏,就看发帖人怎么想了 :)

if [[ "$*" == *"YOURSTRING"* ]]
then
    echo "YES"
else
    echo "NO"
fi

这利用了对$* bash super-test [[...]]括号的特殊处理。

答案3

如何搜索(使用通配符)整个参数空间:

if [[ $@ == *'-disableVenusBld'* ]]
then

编辑:好吧,好吧,这不是一个受欢迎的答案。这个怎么样,它很完美!:

if [[ "${@#-disableVenusBld}" = "$@" ]]
then
    echo "Did not find disableVenusBld"
else
    echo "Found disableVenusBld"
fi

编辑 2:好的,好的,也许这并不完美……我认为只有当 -param 位于列表开头时它才有效,并且还会匹配 -paramXZY 或 -paramABC。我仍然认为原始问题可以通过 bash 字符串操作很好地解决,但我还没有完全解决它……-你能吗??

答案4

disCopperBld=
for x; do
  if [ "$x" = "-disCopperBld" ]; then disCopperBld=1; break; fi
done
if [ -n "$disCopperBld" ]; then
  ...
fi

如果只需要测试从 开始的参数$3,请在函数中进行搜索:

## Usage: search_trailing_parameters NEEDLE NUM "$@"
## Search NEEDLE amongst the parameters, skipping $1 through ${$NUM}.
search_trailing_parameters () {
  needle=$1
  shift $(($2 + 2))
  for x; do
    if [ "$x" = "$needle" ]; then return 0; fi
  done
  return 1
}
if search_trailing_parameters -disCopperBld 2 "$@"; then
  ...
fi

但我想知道你为什么要这样做,这不是一个常见的需求。通常,你会按以下顺序处理选项,就像 Dennis 对你上一个问题的回答一样

相关内容