我尝试过以下命令:
| John Doe | 123 Cherry Lane | 555-555-5555 | Product 3 |
解释(我的假设):
将执行以下命令,并将结果传递给grep命令以过滤匹配的行,文本为“Off”,然后打印第1列和第3列。
while read line;
do
$(/usr/bin/xyz argument1 argument2)
echo '$line'
done <<< $(/usr/bin/xyz argument1 argument3) | grep Off | awk '{print $1,$3}'
第1列和第3列的所有信息都应传递给while循环,该循环读取每一行并在每一行上执行命令。
$(/usr/bin/xyz argument1 argument3) | grep Off | awk '{print $1,$3}'
答案 0 :(得分:0)
你可以像这样写
while read arg1 arg2;
do
/usr/bin/xyz arg1 arg2;
done < <(/usr/bin/xyz otherargument1 otherargument3 | awk '/Off/{print $1,$3}')
请注意,没有行,因为两个参数都传入while块。
此外,您无需grep
,因为您已经拥有awk
。
答案 1 :(得分:0)
只是为了简化代码而不改变逻辑:
while read line; do
$(/usr/bin/xyz argument1 argument2)
echo "$line"
done <<< $(/usr/bin/xyz argument1 argument3) | awk '/Off/ {print $1, $3}'
关于此代码中有些奇怪的一些注意事项:
echo "$line"
我将引号从单引号('
)更改为双引号("
),因为使用单引号时,它将始终输出$line
(字面意思),而使用双引号时,它将输出该变量的内容。
$(/usr/bin/xyz argument1 argument2)
这将运行/usr/bin/xyz argument1 argument2
,获取输出,然后对其进行评估。如果您无法正确控制可能运行的内容,则可能存在安全风险。例如,让我们说/usr/bin/xyz
有效echo
。然后我们可以:
$(echo argument1 argument2)
这意味着while
循环将尝试使用选项argument1
执行 argument2
。这是你想要的吗?
您打算herestring(<<<
)做什么?我猜你不想要任何$(…)
包装,你也不想要这个,但是考虑到神秘的xyz
程序,你很难猜到。
这是做什么的:
/usr/bin/xyz argument1 argument3 | while read line; do
/usr/bin/xyz argument1 argument2
echo "$line"
done | awk '/Off/ {print $1, $3}'
或许awk
应该修改输入?在这种情况下,请尝试:
/usr/bin/xyz argument1 argument3 | awk '/Off/ {print $1, $3}' \
| while read line; do
/usr/bin/xyz argument1 argument2
echo "$line"
done