次の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
無効にします。これはお勧めできません。上記の正しい方法を使用することをお勧めします。
答え2
最初の例では、文字列を使用したときに適用したのと同じ(正しい)ロジックを使用する必要があります。譲受人文字列を変数に変換することもできます。
AUTHGROUP=tunnel My Company
3つの単語はすべて分裂的です。スクリプトで作業しますが、シェルで解釈され、履歴拡張が発生することPASSWD=!PaSsWoRd!
に注意してください。!
一重引用符は囲まれた各文字のリテラル値を保持しますが、二重$
引用符は例外を受け入れ`
ます。それからそれはうまくいきますが、うまくいきません(しかし、やはりスクリプトではなく対話型シェルでのみ問題になります)。\
!
man bash
PASSWD='!PaSsWoRd!'
PASSWD="!PaSsWoRd!"
!
同時に、いつ使用変数:変数値ではなくecho '$PASSWD'
テキストをエコーします。$PASSWD