如果模式匹配则 shell 脚本

如果模式匹配则 shell 脚本

我有包含以下单词的文件

gl-events_0
gl-events_1
gl-events_2
gl-mx-events_0
gl-mx-events_1
gl-mx-events_2

所以我想如果 gl-events 中的匹配模式它应该运行命令 A 如果模式是 gl-mx-events 它应该运行命令 B

我尝试了下面的方法,但它对我不起作用

STR='gl-mx-events_0'
SUB='gl-mx-events'
if [[ "$STR" == *"$SUB"* ]]; then
echo "you need to run command B"

我的要求是模式是否根据单词匹配,它应该运行

command A --- (only for gl-events_0 ...... gl-events_10)
command B --- (only for gl-mx-events_0 ...... gl-mx-events_10)

有人可以指导我如何实现这一目标吗?

问候,武士

答案1

像这样的东西吗?

n=1
while IFS= read -r line; do
    if [[ $line = *gl-events* ]]; then
        printf "line %d has gl_events, doing something\n"  "$n"
        # run command A with "$line"
    fi
    if [[ $line = *gl-mx-events* ]]; then
        printf "line %d has gl-mx-events, doing something different\n"  "$n"
        # run command B with "$line"
    fi
    n=$((n+1))
done  < file

但就像 @Panki 的评论所说,您还可以grep根据关键字过滤行,然后执行xargs所需的命令。例如,使用 GNU 版本的 xargs:

< file grep ^gl-events_    |xargs -d '\n' -n1 echo "running command A with arg" 
< file grep ^gl-mx-events_ |xargs -d '\n' -n1 echo "running command B with arg" 

(默认情况下xargs对待任何输入中的空格分隔输入元素,并以与任何内容都不兼容的方式解释引号和反斜杠。告诉-d '\n'它按原样使用输入行。)

相关内容