こんにちは、複数行のfile.txtをbashスクリプトの引数に単純に渡してコマンドとして実行する方法を理解しようとしています。 whileループを実行する必要があるかわかりませんか?
したがって、テキストファイルには約のようなものが含まれています。
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'
したがって、スクリプトはテキストファイルの行数に応じて実行されます。
this question への回答から示唆されているように、bash read
コマンドを使用してファイルの行を繰り返すことができます。
while read -r line
do
# $line will be a variable which contains one line of the input file
done < your_file.txt
thisへの回答で示唆されているように、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
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