您好,我一直在尝试弄清楚如何简单地将包含多行的 file.txt 传递到 bash 脚本参数中以作为命令运行。不确定我应该做 while 循环吗?
所以文本文件只包含类似 about 的内容。
ip_addr1,foo:bar
ip_addr2,foo2:bar2
user@ip_addr3,foo3:bar3
我只想要一个 bash 脚本从该文件中获取内容并将其用作 bash 脚本,例如
ssh ip_addr1 'echo "foo:bar" > /root/text.txt'
ssh ip_addr2 'echo "foo2:bar2" > /root/text.txt'
ssh user@ip_addr3 'echo "foo3:bar3" > /root/text.txt'
因此,脚本将根据文本文件的行数执行。
答案1
read
您可以按照答案中的建议使用 bash 命令迭代文件的行这个问题。
while read -r line
do
# $line will be a variable which contains one line of the input file
done < your_file.txt
您可以read
再次使用IFS
变量来获取由变量分割的每一行的内容IFS
,如答案所建议的这个问题。
while read -r line
do
# $line will be a variable which contains one line of the input file
IFS=, read -r ip_addr data <<< "$line"
# now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
done < your_file.txt
从那里,您可以使用新变量运行您想要运行的任何命令。
while read -r line
do
# $line will be a variable which contains one line of the input file
IFS=, read -r ip_addr data <<< "$line"
# now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
ssh "$ip_addr" "echo \"${data}\" > /root/text.txt"
done < your_file.txt
如果不需要该$line
变量,可以使用单个read
命令。
while IFS=, read -r ip_addr data
do
# now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
ssh "$ip_addr" "echo \"${data}\" > /root/text.txt"
done < your_file.txt
答案2
使用以下命令将输入文件转换为 shell 脚本sed
$ sed -e "s|\([^,]*\),\(.*\)|ssh -n \"\1\" 'echo \"\2\" >/root/text.txt'|" file
ssh -n "ip_addr1" 'echo "foo:bar" >/root/text.txt'
ssh -n "ip_addr2" 'echo "foo2:bar2" >/root/text.txt'
ssh -n "user@ip_addr3" 'echo "foo3:bar3" >/root/text.txt'
或者awk
,
$ awk -F ',' '{ printf("ssh -n \"%s\" '\''echo \"%s\" >/root/text.txt'\''\n", $1, $2) }' file
ssh -n "ip_addr1" 'echo "foo:bar" >/root/text.txt'
ssh -n "ip_addr2" 'echo "foo2:bar2" >/root/text.txt'
ssh -n "user@ip_addr3" 'echo "foo3:bar3" >/root/text.txt'
然后使用重定向将其中任何一个的输出保存到文件中,并使用sh
.这样您还可以准确记录执行了哪些命令。
或者,您可以使用以下命令执行任一命令的输出
...either command above... | sh -s