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無効にします。これはお勧めできません。上記の正しい方法を使用することをお勧めします。

おすすめ記事