我有一个像这样的服务器列表文件:
xxx ServerName1 xxx
xxx ServerName2 xxx
...
现在我想转到每个服务器从本地重命名文件。我的Bash脚本是这样的:
#!/bin/bash
while read line
do
server=`echo $line | awk '{print $2}'` # get server name
rsh $server mv /a/b/c.txt /a/b/d.txt # rename on the server
echo "rename file in $server" # print echo
done < server.txt
但是,它只会转到第一个&#34; SeverName1&#34;,重命名文件并打印回声。它永远不会到达其他服务器,甚至不会打印回声。我不知道为什么它只适用于第一个。
有人给我一个帮助吗?
答案 0 :(得分:2)
不要让rsh
吃掉输入流的其余部分 - 如果有的话,下次循环尝试while read
时,任何内容都无法读取开始。最简单的方法是从/dev/null
重定向stdin:
rsh "$server" mv /a/b/c.txt /a/b/d.txt </dev/null
或者,你可以循环除0以外的FD(注意这里使用awk
是愚蠢的;你可以告诉bash本身只挑选每行的第二个字段,我在下面的代码中做了):
while read -u 3 _ server _; do # get server name (with read)
rsh "$server" mv /a/b/c.txt /a/b/d.txt # rename on the server
echo "rename file in $server" # print echo
done 3< server.txt
解释一些可能不太明显的要点:
3
是文件描述符号;它需要在-u 3
和3< server.txt
之间进行匹配。如果您希望代码与bash以外的shell兼容,则可以选择使用read _ server _ <&3
而不是依赖read -u
。_
将内容放入read
个字段。 read _ server _
将第一个字段放入_
,将第二个字段放入server
,将第三个字段放入_
。