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명령 결과를 build 이름의 파일로 출력하려면 $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

여기에서는 입력 파일을 한 줄씩 읽도록(각 줄의 선행 및 후행 공백 무시) 루프를 변경했으며 명령문이 "true" 분기를 사용하지 않으면 var값을 얻습니다.unknownif

또한 가 -n필요합니다 ssh. 그렇지 않으면 ssh사용 가능한 모든 입력(여기서는 파일에서 리디렉션됨 servers)이 소비됩니다.

특히 여러 IP 주소를 테스트하는 경우 변경할 수 있는 또 다른 변경 사항은 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

관련 정보