Bashの出力を可変ファイル名にリダイレクトしようとしています。これが私のスクリプトです
#!/bin/bash
for i in `cat servers`
do
if [ "$i" = "198.162.1.3" ];
then
var="Apple"
fi
ssh test@$i "uname -n"
done > /tempout/uname_${var}.txt
/tempout/uname_.txtとしてファイル名を取得しています
予想されるファイル名はuname_Apple.txtである必要があります
コード内のvar
変数は、ループが出力ファイルの作成を開始する前に使用されます。
ssh
コマンドの結果を$var
から構築した名前のファイルに出力する場合は、次のようにします。
#!/bin/bash
while read -r server; do
if [ "$server" = "198.162.1.3" ]; then
var='Apple'
else
var='unknown'
fi
ssh -n "test@$server" 'uname -n' >"/tempout/uname_$var.txt"
done <servers
ここでは、ループを変更して、入力ファイルを1行ずつ読み取るようにしました(各行の先頭と末尾の空白を無視して)、var
に値unknown
を取得しましたif
ステートメントが「true」分岐をとらない場合。
また、ssh
には-n
が必要です。そうでない場合、ssh
はすべての利用可能な入力を消費します(ここではservers
ファイルからリダイレクトされます)。
特に、テストするIPアドレスの数が2つ以上の場合は、if
ステートメントではなくcase ... esac
を使用することもできます。
#!/bin/bash
while read -r server; do
case $server in
198.162.1.3) var=Apple ;;
198.162.1.5) var=cottage ;;
198.162.1.7) var=bumblebee ;;
*) var=unknown
esac
ssh -n "test@$server" 'uname -n' >"/tempout/uname_$var.txt"
done <servers