O seguinte script bash está funcionando perfeitamente:
#!/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 esta tentativa não funciona mais. Eu acho que tenho que colocar alguns caracteres de citação ou similar. Você sabe o que está errado com o script bash abaixo?
A falta de aspas em torno da atribuição de 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. A citação deve impedir que o shell interprete o conteúdo'..'
como especial e mantenha-o como está.A tarefa deveria ter sido escrita como
e passe a variável com expansão entre aspas
Ou desligue a expansão do histórico no script temporariamente incluindo a linha,
set +H
na parte superior do script. Posteriormente, façaset -H
no final para desativá-lo. Isso não é recomendado e muito recomendado para usar a abordagem citada acima.A mesma lógica (correta) que você está aplicando ao usar strings em seu primeiro exemplo também deve ser usada ao atribuir strings a variáveis.
Nas
AUTHGROUP=tunnel My Company
três palavras são divididas. EPASSWD=!PaSsWoRd!
funciona em um script, mas lembre-se de que o!
seria interpretado em um shell, acionando a expansão do histórico.Observe que aspas simples preservarão o valor literal de cada caractere incluído, enquanto aspas duplas permitirão exceções:
$
,`
e\
(!
consulte CITAÇÕES emman bash
). Então,PASSWD='!PaSsWoRd!'
funcionará,PASSWD="!PaSsWoRd!"
não (mas, novamente,!
é problemático apenas em shells interativos, não em scripts).Ao mesmo tempo, você precisará de aspas duplas ao usar variáveis:
echo '$PASSWD'
ecoará o literal$PASSWD
, não o valor da variável.