ima*_*453 95 linux unix bash shell-script
我正在尝试编写一个脚本,我想检查传递给 bash 脚本的任何参数是否与字符串匹配。我现在设置的方式是
if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]
Run Code Online (Sandbox Code Playgroud)
但可能有大量参数,所以我想知道是否有更好的方法来做到这一点?
谢谢
编辑:我尝试了这段代码,并使用选项 -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
Run Code Online (Sandbox Code Playgroud)
Nor*_*ray 75
看起来您正在 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
Run Code Online (Sandbox Code Playgroud)
(有几个缩进 的约定;;,一些 shell 允许您提供选项 as (--opt1),以帮助括号匹配,但这是基本思想)
Ric*_*lka 56
这对我有用。它完全按照您的要求执行,仅此而已(无选项处理)。无论这是好是坏都是海报的练习:)
if [[ "$*" == *YOURSTRING* ]]
then
echo "YES"
else
echo "NO"
fi
Run Code Online (Sandbox Code Playgroud)
这利用了对$*
bash super-test [[...]]括号的特殊处理。
如何搜索(使用通配符)整个参数空间:
if [[ $@ == *'-disableVenusBld'* ]]
then
Run Code Online (Sandbox Code Playgroud)
编辑:好的,好的,所以这不是一个受欢迎的答案。这个怎么样,太完美了!:
if [[ "${@#-disableVenusBld}" = "$@" ]]
then
echo "Did not find disableVenusBld"
else
echo "Found disableVenusBld"
fi
Run Code Online (Sandbox Code Playgroud)
Edit2:好的,好的,也许这并不完美......认为它只有在 -param 位于列表的开头时才有效,并且也会匹配 -paramXZY 或 -paramABC。我仍然认为原始问题可以通过 bash 字符串操作很好地解决,但我在这里还没有完全破解它...... -你能吗??
[[ "$@" =~ '-disableVenusBld' ]] && disableVenusBld=true
[[ "$@" =~ '-disCopperBld' ]] && disCopperBld=true
[[ "$@" =~ '-disableTest' ]] && disableTest=true
[[ "$@" =~ '-disableUpdate' ]] && disableUpdate=true
Run Code Online (Sandbox Code Playgroud)
或者更一般地说
[[ "$@" =~ 'your-string' ]] && ( doSomething )
Run Code Online (Sandbox Code Playgroud)
2023 年 12 月编辑:解决下面的评论,使用锚点进行精确匹配(可读性稍差,但惊喜较少):
#!/bin/bash
[[ "$*" =~ ^-disableVenusBld$ ]] && disableVenusBld=true
[[ "$*" =~ ^-disCopperBld$ ]] && disCopperBld=true
[[ "$*" =~ ^-disableTest$ ]] && disableTest=true
[[ "$*" =~ ^-disableUpdate$ ]] && disableUpdate=true
Run Code Online (Sandbox Code Playgroud)