bash脚本中的读命令

时间:2017-06-19 15:03:02

标签: bash

我试图开始使用read -r,但到目前为止还没有运气。 以下脚本(下面添加)应该从/ etc / hosts创建SSH服务器列表,然后执行该命令。我将它用于简单管理,添加用户等。

我通常使用sshservers=($(<serverlist.txt)),但我上周通过Shellcheck运行了我的脚本,它说我应该使用read -r代替。 所以我补充说,但现在我的脚本在运行时卡住了。

是否有人能够帮助我如何正确使用read -r? (如果你有任何进一步的提示或说明,请告诉我,我仍在学习Bash,你可能会看到我的剧本嘿嘿)。

提前致谢!

#!/bin/bash
serverlist=/home/demo/serverlist.txt
: > "$serverlist"
sed -e '/^#/d' /etc/hosts | awk '{print $2}' >> "$serverlist"
sed -i -- '/^localhost/ d' "$serverlist"
#sshservers=($(<serverlist.txt))
sshservers=$(read serverlist)
for sshserver in "${sshservers[@]}"
        do
        ssh -t demo@"$sshserver" "hostname && sudo ls /root/"
done
echo "done"

编辑:/home/demo/serverlist.txt包含具有以下格式的IP,不确定它是否有帮助:

192.168.1.1
192.168.1.2
192.168.1.3 

1 个答案:

答案 0 :(得分:2)

使用旧版本的bash(如果你想要数组中的行):

sshservers=()
while read -r servername; do
    sshservers+=("$servername")
done < "$serverlist" 

bash 4+中,您可以使用readarray

sshservers=()
readarray sshservers < "$serverlist"

或者在这种情况下,如果你真的不需要文件中的服务器名,你可以像这样循环结果:

while read -r sshserver: do
    ssh -t "demo@$sshserver" "hostname && sudo ls /root/"
done < <(sed -e '/^#/d' /etc/hosts | awk '{print $2}' | grep -vE '^$|^localhost')