web-dev-qa-db-ja.com

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である必要があります

3
xrkr

コード内の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
7
Kusalananda