在bash中循环获取多于1个变量以在一个命令中使用它

时间:2013-11-23 06:24:50

标签: linux bash

我有一个文本文件,我需要从同一文本中获取2个变量并将它们放在一个命令中,如

for i in `cat TEXT | grep -i UID | awk '{print($2)}'` && 
x in `cat TEXT | grep -i LOGICAL | awk '{print($4)}'`
do 
  echo "naviseccli -h 10.1.1.37 sancopy -create -incremental -name copy_$i -srcwwn $x -destwwn xxxxxxxxxxxxxxxxxxxxxx -verify -linkbw 2048" >> OUTPUT
done

是否有任何可能的方法来实现存储管理员并需要做大量的命令,所以我需要让这个脚本来做它

4 个答案:

答案 0 :(得分:1)

您可以使用文件描述符。此外,您的catgrepawk命令可以合并为一个awk命令:

exec 5< <(awk '{IGNORECASE=1}/UID/ {print $2}' TEXT)
exec 6< <(awk '{IGNORECASE=1}/LOGICAL/ {print $4}' TEXT)
while read i <&5 && read x <&6
do
  echo command $i $x         # Do something with i and x here!
done

答案 1 :(得分:0)

首先执行cat操作并将结果保存到两个数组中。然后,您可以使用一个数组上的索引进行迭代,并使用相同的索引来访问另一个数组。

请参阅关于bash中数组的http://tldp.org/LDP/abs/html/arrays.html。特别参见“示例27-5。将脚本内容加载到数组中”部分。

使用该资源,您既可以填充数组,也可以处理它们。

答案 2 :(得分:0)

由于你的单词中没有空格(通过使用awk),你可以使用:

paste <(grep -i UID     TEXT | awk '{print($2)}') \
      <(grep -i LOGICAL TEXT | awk '{print($4)}') |
while read i x
do 
  echo "naviseccli -h 10.1.1.37 sancopy -create -incremental -name copy_$i -srcwwn" \
       "$x -destwwn xxxxxxxxxxxxxxxxxxxxxx -verify -linkbw 2048" >> OUTPUT
done

这使用Process Substitutionpaste提供两个拼凑在一起的文件。每一行都有两个字段,可以读入ix,以便在循环体中使用。

请注意,无需使用cat;您有资格获得UUOC(无用cat)奖。

答案 3 :(得分:0)

Imma误以为UIDLOGICAL必须位于您的传入TEXT的同一行,在这种情况下,这实际上可能会有所帮助并且有效:

cat TEST | awk '/LOGICAL/ && /UID/ { print $2, $4 }' | while read i x
do 
  echo "naviseccli -h 10.1.1.37 sancopy -create -incremental -name copy_$i -srcwwn" \
       "$x -destwwn xxxxxxxxxxxxxxxxxxxxxx -verify -linkbw 2048"
done