Comparação de variáveis dentro de Bash

1

Estou tentando comparar duas variáveis dentro de uma condição if:

#!/bin/bash
Jump="/home/Lists/srv"
S='echo "$1" | perl -ne 'print lc''
J1='grep $S $Jump |awk '{print $1}''
grep $S $Jump >> /dev/null
if [ $? = 0 ]
 then
   if [ "$S" == "$J1" ]
   then
     echo "$S" is equal to "$J1" :
     ssh -qt $S "$2"
   else
     echo "$S" is not equal to "$J1"
     ssh -qt $J1 "ssh -qt $S $2"
   fi
  else 
    ssh -qt $S "$2"
  fi

Sempre que tento executá-lo, sempre vou para outra condição. e executa echo "$S" is not equal to "$J1"

Estou executando este script como ./test.sh seguido de um nome de servidor para ex:

./test.sh hostname1

Depois, diminua o caso e coloque-o na variável S e procure por $S no arquivo Jump="/home/Lists/srv" . Se ele encontrar, deverá colocar a primeira coluna na coluna e colocá-la em outra variável J1 . Agora, se o valor de S e J1 for semelhante, então deve ser ssh para $S else (primeiro) primeiro deve ser ssh para $J1 e, em seguida, ssh para $S . Else (2nd) se não encontrar $S no arquivo Jump ele deve diretamente ssh $S .

Enquanto eu estou executando diretamente vai para 1ª condição. mesmo se $S e $J1 forem semelhantes.

Alguém por favor pode me orientar onde estou fazendo errado ...

    
por Vikas Thakur 14.01.2017 / 11:23

1 resposta

3

A partir da sua descrição do que você está tentando alcançar, o seguinte pode ser um script que faz isso:

#!/bin/bash

server="${1,,}"

jumphost="$( awk -vs="$server" '$0 ~ s { print $1; exit }' "/home/Lists/srv" )"

if [[ -z "$jumphost" ]] || [[ "$jumphost" == "$server" ]]; then
    ssh -qt "$server" "$2"
else
    ssh -qt "$jumphost" "ssh -qt \"$server\" \"$2\""
fi

A expansão do parâmetro ${1,,} diminuirá o valor de $1 . Para versões mais antigas de bash , use o seguinte:

server="$( printf '%s' "$1" | tr 'A-Z' 'a-z' )"

A variável jumphost será definida para o que estiver na primeira coluna da primeira linha no arquivo /home/Lists/srv correspondente ao nome do servidor. Observe que isso só seleciona a correspondência primeiro no arquivo e que a correspondência está levando em consideração a linha todo .

Se a correspondência deve ser somente contra a segunda coluna, altere $0 para $2 no script Awk.

Se $jumphost estiver vazio, ou se for o mesmo que $server , então o primeiro ramo será escolhido, caso contrário, o segundo.

Uma explicação do script Awk foi solicitada:

jumphost="$( awk -vs="$server" '$0 ~ s { print $1; exit }'

Com -v one define uma variável Awk para um valor específico. No comando acima, configuramos a variável Awk s para o valor de $server . Esta variável está então disponível no script Awk.

No script Awk,

$0 ~ s { print $1; exit }

o código dentro de { ... } será executado sempre que a condição $0 ~ s for verdadeira. A condição $0 ~ s significa " $0 matches (a expressão regular) s ". A variável s é a que fornecemos o valor de $server antes e $0 é o conteúdo do registro atual (linha) que o Awk acabou de ler. Então, em suma, isso encontra uma linha no arquivo que contém o nome do servidor.

Para forçar uma correspondência exata na segunda coluna (por exemplo), pode-se usar $2 == s como condição.

O código em { ... } imprimirá $1 , que é o primeiro campo (coluna) de $0 (a linha), antes de sair do script. Eu estou escolhendo sair para que não acabemos combinando mais do que uma única linha. Se o usuário especificar um valor muito vago para $server , corremos o risco de combinar várias linhas de outra forma.

Por fim, o valor gerado pelo Awk será atribuído à variável do shell jumphost a $( ... ) , que é aproximadamente igual a '...' .

    
por 14.01.2017 / 12:52