Bash出力を変数ファイル名にリダイレクトできません。

Bash出力を変数ファイル名にリダイレクトできません。

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値を取得します。unknownif

またが-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

おすすめ記事