虽然在shell脚本上读取2次不起作用

时间:2018-02-14 13:02:07

标签: sh

我正在编写一个脚本,当我尝试使用while读取2次时,第一个循环只能工作一次。

un=$(echo $LOGNAME | tr '[A-Z]' '[a-z]')
grep -v '^#' nodeteste.txt > auxiliar.txt
while read line
do
  ssh "$un@$line" "cat arquivo" > arquivo.externo
  cut -d "," -f 1 arquivo.externo > arquivo.externo.cut
  uniq arquivo.externo.cut > arquivo.externo.cut.uniq
  while read line2
  do
   valor=$(grep -c "$line2 " arquivo.base)
   if [ $valor -eq 0 ]; then
     echo $line >> arquivo.base.diferente
     echo $line2 >> arquivo.base.diferente
     grep -i "$line2," arquivo.externo >> arquivo.base.diferente
     echo $line $line2 $valor "eh diferente"
   fi
  done < arquivo.externo.cut.uniq
done < auxiliar.txt
rm auxiliar.txt

我想我随时都会失去stdin / out但是我被困在这里,任何想法?

2 个答案:

答案 0 :(得分:1)

要查看正在发生的事情,请在循环中删除所有不必要的内容:

while read line ; do
    echo "outer: $line"
    while read line2 ; do
        echo "inner $line2"
    done
done

当你运行它时,你会得到

test
outer: test
test
inner test
test
inner test
^Dtest
outer: test
test
inner test
^D^D

当您从文件中获取输入时,它会变得不同。例如:创建文件a

a
a
a
a
a

和文件b

b
b
b
b
b

并且做:

while read line ; do
    echo "outer: $line"
    while read line2 ; do
        echo "inner $line2"
    done <b
done <a

结果将是:

outer: a
inner b
inner b
inner b
inner b
inner b

而不是外圈的5倍。

解决方案是:

for line in $(<a) ; do 
    echo "outer: $line"
    for line2 in $(<b) ; do 
        echo "inner $line2"
    done
done 

outer: a
inner b
inner b
inner b
outer: a
inner b
inner b
inner b
outer: a
inner b
inner b
inner b

(我已将ab缩短了一点)

答案 1 :(得分:0)

在这里我发现了问题,ssh使用de stdin导致1循环只能工作一次,当我使用-n选项时sdtin是重定向。

问题来源:

ssh "$un@$line" "cat arquivo" > arquivo.externo

作品来源:

ssh -n "$un@$line" "cat arquivo" > arquivo.externo

SSH手册: -n从/ dev / null重定向stdin(阻止读取stdin)。