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