次のbashスクリプトは完全に実行されます。
#!/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
しかし、以前の入力パラメータを次の変数に置き換えたいと思います。
#!/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
残念ながら、この試みはもう機能しません。引用符または類似の文字を入力する必要があるようです。次のbashスクリプトにどのような問題があるのかご存知ですか?
ベストアンサー1
!
ここでの問題は、埋め込み変数に値を割り当てるときに引用符が欠落していることです。シェルは、!
変数に割り当てる前に、まず履歴拡張を実行するために文字を解釈しようとします。引用は、シェルが内容を'..'
特別に解釈するのを防ぎ、そのままにしておく必要があります。
宿題は次のように書く必要があります。
PASSWD='!PaSsWoRd!'
引用された拡張を介して変数を渡します。
echo "$PASSWD" | openconnect --csd-wrapper="$WRAPPER" --authenticate --user="$USER" --authgroup="$AUTHGROUP" --passwd-on-stdin "$DOMAIN"
set +H
または、スクリプトの上部に行を追加して、スクリプトの履歴拡張を一時的に無効にします。次に、最後にこれを実行してset -H
無効にします。これはお勧めできません。上記の正しい方法を使用することをお勧めします。