我试图开始使用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
答案 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')