テキストファイル行を区切り引数としてコマンドに渡しますか?

テキストファイル行を区切り引数としてコマンドに渡しますか?

こんにちは、私はいくつかの行を含む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

次のコマンドを使用して、入力ファイルをシェルスクリプトに変換します。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

関連情報