我正在编写一个脚本,当我尝试使用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但是我被困在这里,任何想法?
答案 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
(我已将a
和b
缩短了一点)
答案 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)。