Arrays 在bash中将命令的输出与数组匹配

Arrays 在bash中将命令的输出与数组匹配,arrays,linux,bash,Arrays,Linux,Bash,我已经搜索了一段时间,但找不到这个问题的答案。我希望将特定命令的输出与脚本中的数组相匹配。我是一名perl程序员,但由于我必须使用的系统类型的限制,我不能使用perl,我不得不求助于bash来编写脚本。仅供参考的是Debian 5.0.6 因此,每当我的sudo命令在特定的IP上运行时,它就会给出数组中的某些单词。我需要将数组中的任何单词与输出中的任何单词进行匹配 此外,该阵列需要查看228个不同的内容 我的email变量是当它找到一个并且自身工作正常时发送 array=("City1" "Ci

我已经搜索了一段时间,但找不到这个问题的答案。我希望将特定命令的输出与脚本中的数组相匹配。我是一名perl程序员,但由于我必须使用的系统类型的限制,我不能使用perl,我不得不求助于bash来编写脚本。仅供参考的是Debian 5.0.6

因此,每当我的sudo命令在特定的IP上运行时,它就会给出数组中的某些单词。我需要将数组中的任何单词与输出中的任何单词进行匹配

此外,该阵列需要查看228个不同的内容

我的email变量是当它找到一个并且自身工作正常时发送

array=("City1" "City2" "City 3")

sudo -u user /usr/local/bin/someprogram.pl x.x.x.x;
MATCH1=`grep "$array"`
if [ "{$MATCH1}" != ""]
then
    do $email
else done
fi

我非常感谢你在这方面的帮助。我为我对bash脚本的无知表示歉意。

如果我正确理解了您的问题:您可以遍历返回的每一行,遍历每个模式,如果存在匹配项,则发送电子邮件

sudo -u user /usr/local/bin/someprogram.pl x.x.x.x | while read line; do
    for pattern in "${array[@]}"; do
        if [[ $line =~ $pattern ]]; then
            $email
            break  # exit after the first match, or comment out if you want to keep going
        fi
    done
done
更新

如果有很多模式和很多行,脚本可能会很慢。也许您可以每行打印一个点作为“进度指示器”,例如:

sudo -u user /usr/local/bin/someprogram.pl x.x.x.x | while read line; do
    printf .       # prints a dot without linebreak
    for pattern in "${array[@]}"; do
        if [[ $line =~ $pattern ]]; then
            echo   # just to clear the line after the printf statements
            $email
            break  # exit after the first match, or comment out if you want to keep going
        fi
    done
done
echo   # clear the line after the printf statements

我认为Janos的解决方案更好,因为它更具可读性和可维护性,但这里的解决方案更类似于您提供的代码模板:

#!/bin/bash

printWords() {
  echo City 1 City x
  echo City 2
  echo City y
  echo City 3
}

CMD_OUTPUT=$(printWords)

array=("City 1" "City 3")

MATCH=$(echo $CMD_OUTPUT | grep -E "${array[0]}${array[*]/#/|}")

if [ -n "$MATCH" ] ; then
    echo email
fi

${array[0]}${array[*]/#/$(echo\|)}
在这种情况下会导致
城市1 |城市1 |城市3
。第二个替换
${array[*]/#/|}
匹配每个数组元素的(空)开头,并将其替换为管道符号
|
,以构造OR正则表达式。然而,正则表达式将以管道符号开始,因此也匹配任何空字符串,这就是为什么我在数组的第一个元素前加前缀的原因。还请注意使用
[@]
[*]

这很好,但它不会像以前那样返回任何行,只是在那里停留一分钟,然后返回提示。我也没有从中得到任何错误,只是看起来很奇怪。非常感谢。@Nvasion我用另一个版本的脚本更新了我的文章,使用了某种“进度指示器”,如果有帮助的话。是的,它通过10行IP,然后通过数组中的228个项目。最后的脚本运行大约需要10分钟。我仍然让另一个工程师手动运行这些命令,我正在运行这个脚本一周,以确保它正在做它应该做的事情。但非常感谢。非常感谢你在这方面帮助我,但是Jano的解决方案可能会更好,因为我正试图用它做什么,但我会把你给我的东西放在手边。