Não é possível redirecionar a saída bash para o nome do arquivo variável

3

Estou tentando redirecionar a saída bash para um nome de arquivo variável. Aqui está o meu script parece

#!/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

Estou obtendo o nome do arquivo como /tempout/uname_.txt

O nome do arquivo esperado deve ser uname_apple.txt

    
por xrkr 07.09.2018 / 11:28

1 resposta

7

A variável var em seu código é usada antes do início do loop para criar o arquivo de saída.

Se você deseja enviar o resultado do comando ssh para um arquivo cujo nome você construiu a partir de $var , faça o seguinte:

#!/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

Aqui, eu também alterei o loop para que ele leia o arquivo de entrada linha por linha (ignorando espaços em branco à esquerda e à direita em cada linha), e eu fiz var obter o valor unknown se a% A instruçãoif não aceita o ramo "verdadeiro".

Além disso, você precisa de -n para ssh . Caso contrário, ssh consumiria toda a entrada disponível (aqui redirecionada do arquivo servers ).

Outra alteração que pode ser feita é usar case ... esac em vez de uma instrução if , especialmente se o número de endereços IP que você testou for maior que um par:

#!/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
    
por 07.09.2018 / 11:35