读取线路循环的shell脚本在第一行之后停止
我有以下的shell脚本。 目的是循环通过目标文件(其path是脚本的input参数)的每一行,并针对每一行进行工作。 现在,它似乎只能用于目标文件的第一行,并在处理该行后停止。 我的脚本有什么问题吗?
#!/bin/bash # SCRIPT: do.sh # PURPOSE: loop thru the targets FILENAME=$1 count=0 echo "proceed with $FILENAME" while read LINE; do let count++ echo "$count $LINE" sh ./do_work.sh $LINE done < $FILENAME echo "\ntotal $count targets"
问题是, do_work.sh
运行ssh
命令,默认情况下, ssh
从你的input文件stdin中读取数据。 因此,你只能看到第一行处理,因为ssh
消耗文件的其余部分,而你的循环终止。
为了防止出现这种情况,请将-n
选项传递给您的ssh
命令,使其从/dev/null
而不是stdin中读取。
ssh -n选项可防止在将输出传输到另一个程序时使用HEREdoc检查ssh的退出状态。 所以使用/ dev / null作为stdin是首选。
#!/bin/bash while read ONELINE ; do ssh ubuntu@host_xyz </dev/null <<EOF 2>&1 | filter_pgm echo "Hi, $ONELINE. You come here often?" process_response_pgm EOF if [ ${PIPESTATUS[0]} -ne 0 ] ; then echo "aborting loop" exit ${PIPESTATUS[0]} fi done << input_list.txt
使用ssh -n ...
通过ssh运行远程命令。