Bash-Script: Como inserir variáveis no Bash-Script?

1

O seguinte script bash está funcionando completamente bem:

#!/bin/bash

echo '!PaSsWoRd!' | openconnect --csd-wrapper=/home/user/.cisco/csd-wrapper.sh --authenticate --user=abcde123 --authgroup="tunnel My Company" --passwd-on-stdin vpn.mycompany.com

No entanto, quero substituir os parâmetros de entrada anteriores por variáveis como essa:

#!/bin/bash

WRAPPER=/home/user/.cisco/csd-wrapper.sh
USER=abcde123
PASSWD=!PaSsWoRd!
AUTHGROUP=tunnel My Company
DOMAIN=vpn.mycompany.com

echo '$PASSWD' | openconnect --csd-wrapper=$WRAPPER --authenticate --user=$USER --authgroup="$AUTHGROUP" --passwd-on-stdin $DOMAIN

Infelizmente essa tentativa não funciona mais. Eu acho que tenho que colocar alguns caracteres de citação ou similar. Você sabe o que há de errado com o script bash abaixo?

    
por Dave 12.11.2018 / 15:42

2 respostas

1

A falta de aspas em torno da atribuição a uma variável contendo ! é o problema aqui. O shell tenta interpretar o caractere ! para executar a expansão do histórico antes de atribuí-lo à variável. As citações devem impedir que o shell interprete o conteúdo como '..' como especial e mantenha-o como está.

A tarefa deveria ter sido escrita como

PASSWD='!PaSsWoRd!'

e passar a variável com expansão citada

echo "$PASSWD" | openconnect --csd-wrapper="$WRAPPER" --authenticate --user="$USER" --authgroup="$AUTHGROUP" --passwd-on-stdin "$DOMAIN"

Ou altere temporariamente a expansão do histórico no script, incluindo a linha set +H na parte superior do script. Subseqüentemente, execute set -H no final para desabilitá-lo. Isso não é recomendado e muito recomendado para usar a abordagem correta citada acima.

    
por 12.11.2018 / 15:45
1

A mesma lógica (correta) que você está aplicando ao usar as mordidas em seu primeiro exemplo deve ser usada quando atribuir strings a variáveis, também.

Em AUTHGROUP=tunnel My Company , as três palavras são divididas. E PASSWD=!PaSsWoRd! funciona em um script, mas tenha em mente que o ! seria interpretado em um shell, acionando a expansão do histórico.

Observe que as aspas simples preservarão o valor literal de cada caractere incluído, enquanto as aspas duplas permitirão exceções: $ , ' , \ e ! (consulte QUOTING em man bash ). Então, PASSWD='!PaSsWoRd!' funcionará, PASSWD="!PaSsWoRd!" não.

Ao mesmo tempo, você precisará de aspas duplas quando usar variáveis: echo '$PASSWD' ecoará o literal $PASSWD , não o valor da variável.

    
por 12.11.2018 / 16:03