我正在尝试编写一个脚本,用于检查传递给 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 对你上一个问题的回答一样。