对于在bash获得超过1个变量来在一个命令中使用它环[关闭](for loop in bash to

2019-10-19 01:13发布

我有一个文本文件,我需要从同一文本得到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

有来实现这一目标时存储管理员和需要做吨的命令,所以我需要得到这个脚本做任何可能的方式

Answer 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


Answer 2:

执行cat第一运算,并将结果保存成两个阵列。 然后你就可以在一个阵列的索引迭代,并使用相同的索引也进入另一个。

见http://tldp.org/LDP/abs/html/arrays.html约在bash阵列。 特别请参见“ 实施例27-5。加载脚本的内容到一个数组 ”。

与资源,你应该能够既填充您的阵列,然后同时处理它们。



Answer 3:

因为你的话没有在他们的空间(由于使用的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

它使用进程替换给paste两个文件,它拼在一起。 每一行上会有两个领域,这是读入ix在循环体中使用。

请注意,有没有必要使用cat ; 你有资格获得一个UUOC(无用的使用cat奖)。



Answer 4:

伊马采取野生猜测, 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


文章来源: for loop in bash to get more than 1 variables to use it in one command [closed]
标签: linux bash