将文本文件行作为分隔的参数传递给命令?

将文本文件行作为分隔的参数传递给命令?

您好,我一直在尝试弄清楚如何简单地将包含多行的 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

相关内容