Bash从文件读取和parsing每一行

我需要pipe理几个客户的Linux服务器上的特定软件的更新。 通过向每个服务器发送.tar.gz文件并使其覆盖覆盖旧的软件文件来提供更新。

我把客户的服务器列表放在一个txt文件中,如下所示:

user1@customer-server-1-address:22:/path/to/software/server1:NULL:Customer1name user2@customer-server-2-address:2222:/path/to/software/server2:/etc/vpnc/client1.conf:Customer2name user3@customer-server-3-address:22:/path/to/software/server3:NULL:Customer3name 

字符“:”充当字段分隔符; 字段1是服务器地址,2是端口,3是软件的path,4是用来告诉是否首先启用VPN隧道,5是客户名称。

我设法创build了以下脚本:

 #!/bin/bash [...] while IFS=':' read -ra array; do if [ "${array[3]}" != "NULL" ]; then echo echo "### USING VPN CONF '${array[3]}' FOR SERVER '${array[0]}'... ###" sleep 1 #vpnc ${array[3]} TUNNEL1=$(ifconfig | grep -o eth0) TUNNEL2='eth0' if [ "$TUNNEL1" = "$TUNNEL2" ]; then echo "### TUNNEL IS UP ###" scp -P${array[1]} $FILENAME.gz ${array[0]}:${array[2]} scp -P${array[1]} $FILELIST ${array[0]}:${array[2]} ssh -p${array[1]} ${array[0]} 'cd '${array[2]}' && cat '${array[2]}'/'$FILELIST' | cpio --quiet -H ustar -o -0 -L -F '${array[2]}'/'$BACKUP_FILENAME ssh -p${array[1]} ${array[0]} 'gzip '${array[2]}'/'$BACKUP_FILENAME ssh -p${array[1]} ${array[0]} 'tar -C '${array[2]}' -xf '${array[2]}'/'$FILENAME.gz ssh -p${array[1]} ${array[0]} 'cd '${array[2]}' && mkdir -p '$REMOTE_BACKUP_DIRECTORY' && rm -f '$FILELIST' && mv -f '$BACKUP_FILENAME.gz $REMOTE_BACKUP_DIRECTORY echo "### SERVER '${array[0]}' UPDATED ###" #vpnc-disconnect sleep 1 else echo "### VPN ERROR IN SERVER '${array[4]}' ###" fi else echo scp -P${array[1]} $FILENAME.gz ${array[0]}:${array[2]} scp -P${array[1]} $FILELIST ${array[0]}:${array[2]} ssh -p${array[1]} ${array[0]} 'cd '${array[2]}' && cat '${array[2]}'/'$FILELIST' | cpio --quiet -H ustar -o -0 -L -F '${array[2]}'/'$BACKUP_FILENAME-${array[4]} ssh -p${array[1]} ${array[0]} 'gzip '${array[2]}'/'$BACKUP_FILENAME-${array[4]} ssh -p${array[1]} ${array[0]} 'tar -C '${array[2]}' -xf '${array[2]}'/'$FILENAME.gz ssh -p${array[1]} ${array[0]} 'cd '${array[2]}' && mkdir -p '$REMOTE_BACKUP_DIRECTORY' && rm -f '$FILELIST' && mv -f '$BACKUP_FILENAME-${array[4]}.gz $REMOTE_BACKUP_DIRECTORY echo "### SERVER '${array[4]}' UPDATED ###" echo fi; done < "$CUSTOMER_SERVERS_FILE" 

$ CUSTOMER_SERVERS_FILE是前面描述的容器文件,$ FILENAME.gz是更新包,$ FILELIST是要更新的文件的列表。 其他variables设置为其他目的。

问题是,这整个事情只有在我的$ CUSTOMER_SERVERS_FILE的第一个客户有效运行。 第一条线以上的行被跳过,我不知道为什么。 任何提示? 谢谢。

编辑:作为一个重复的异议的答案,作为剧本相当大,我没有想到之间的任何连接和SSH对象。 我宁愿更多地考虑一个语法错误。 不过,如果要求,我仍然可以删除这个问题。

发生这种情况是因为你while read循环和ssh都从标准输入读取。

您可以通过使用/dev/null作为ssh的stdin来修复它:

 ssh host cmd < /dev/null