Bashスクリプト:Bashスクリプトに変数を挿入するには?

Bashスクリプト:Bashスクリプトに変数を挿入するには?

次の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 Company3つの単語はすべて分裂的です。スクリプトで作業しますが、シェルで解釈され、履歴拡張が発生することPASSWD=!PaSsWoRd!に注意してください。!

一重引用符は囲まれた各文字のリテラル値を保持しますが、二重$引用符は例外を受け入れ`ます。それからそれはうまくいきますが、うまくいきません(しかし、やはりスクリプトではなく対話型シェルでのみ問題になります)。\!man bashPASSWD='!PaSsWoRd!'PASSWD="!PaSsWoRd!"!

同時に、いつ使用変数:変数値ではなくecho '$PASSWD'テキストをエコーし​​ます。$PASSWD

関連情報