所述命令的输出示例:
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。
我可以匹配可以输出一行的命令的输出,但不知道如何处理喷出多行的命令。
答案 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'
您可以source
或eval
结果,并根据所有变量执行任何操作。