如何测试bash脚本命令的多行输出字段?

时间:2015-02-28 01:48:04

标签: bash

所述命令的输出示例:

user@machine:~$ qy glin list-name
name:           list-name
maillist:       1
...similar lines that look like this...
modby:          user
modwith:        tool

在脚本中,我希望能够在IF语句中说:

如果modby = userfoo和modwith = toolbar,请执行xyz。

我可以匹配可以输出一行的命令的输出,但不知道如何处理喷出多行的命令。

3 个答案:

答案 0 :(得分:1)

一种优雅的方式可能是使用Awk:

qy glin list-name | awk '{
        if (($1=="modby:")&&($2=="user")) A=1;
        if (($1=="modwith:")&&($2=="tool")) B=1;}
        END {exit A&&B}'

 if [ $? -eq 1 ]; then
    echo FOUND
 fi

请注意,如果要测试有序和连续行,可以使用以下命令:

 qy glin list-name | awk '{if (($1=="modby:")&&($2=="user")) {
           getline; if (($1=="modwith:")&&($2=="tool")) exit 1;}}'

答案 1 :(得分:0)

您可以将命令的输出管道/重定向到while read -r line; do...[insert your if condition with actions here] done

read逐行读取输出,您可能已经知道如何匹配单行的输出。如果read包含空格,也可以将bash行读入多个变量。

对于您的示例,以下内容(可以写成一行 - 但不是为了提高可读性)可以在while read -r key value; do if [[ $key = modby: ]]; then user=$value elif [[ $key = modwith: ]]; then tool=$value fi if [[ $user = "user" && $tool = "tool" ]]; then printf 'MTFBWY!\n'; unset user tool; fi done < <(qy glin list-name) 上使用:

{{1}}

..虽然这可能不是最佳解决方案,但它可以解决您的问题。

希望有所帮助!

答案 2 :(得分:0)

如何将脚本输出转换为可以执行的shell代码?假设第一列中的单词作为shell变量名有效,而第二列中的单词不包含单引号,则使用此sed脚本可能有效:

$ qy glin list-name | sed "s/\([^:]*\): *\(.*\)/\1='\2'/"
name='list-name'
maillist='1'
modby='user'
modwith='tool'

您可以sourceeval结果,并根据所有变量执行任何操作。