web-dev-qa-db-ja.com

エスケープされていないドル記号を含む変数をbashでエコーする方法

エスケープされていないドル記号を含む変数がある場合、変数の内容全体をエコーする方法はありますか?

たとえば、何かがスクリプトを呼び出します。

./script.sh "test1$test2"

次に、パラメータを使用する場合は、次のように「切り捨て」られます。

echo ${1}
test1

もちろん、変数名を一重引用しても役に立ちません。スクリプトがパラメーターを受け取ったら、少なくともドル記号を自分でエスケープできるように、引用する方法がわかりません。

17
Not22

スクリプトが実行される前に、変数が置き換えられます。

./script.sh 'test1$test2'

問題は、スクリプトが最初に「test1」を受け取り、空の(宣言されていない)変数への参照があったことを認識できない可能性があることです。次のように、スクリプトに渡す前に$をエスケープする必要があります。

./script.sh "test1\$test2"

または、次のように一重引用符'を使用します。

./script.sh 'test1$test2'

この場合、bashはそのパラメーター文字列から変数を展開しません。

30
user405725

一重引用符を使用することにより、$のようなメタ文字はそのリテラル値を保持します。二重引用符を使用すると、変数名が補間されます。

4
ghostdog74

Ignacioが言ったように、変数が置き換えられるため、スクリプトは./script.sh test1$0の値として$1を取得します。

ただし、引数を渡すためにリテラル引用符を使用した場合でも、常に"$1"echo "${1}"を引用する必要があります。これは良い習慣です。

0
Benoit