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 でなければなりません。
答え1
コードの変数は、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行ずつ読み込むように(各行の先頭と末尾のスペースを無視する)ループを変更し、ステートメントが "true"ブランチを使用しない場合はvar
値を取得します。unknown
if
またが-n
必要ですssh
。それ以外の場合は、ssh
使用可能なすべての入力(ここではファイルからリダイレクトされますservers
)が消費されます。
特に複数のIPアドレスをテストする場合、変更できるもう1つの変更は代わりにcase ... esac
ステートメントを使用することです。if
#!/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