Bash で引用符で囲まれた文字列内で環境変数を使用する方法 質問する

Bash で引用符で囲まれた文字列内で環境変数を使用する方法 質問する

私は bash スクリプトで以下のさまざまな形式を試しました。

#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

しかし、環境変数を正しく展開するための構文を取得できませんCOLUMNS

私は次のようなさまざまな形式を試しました。

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

そして

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

そして

eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

提案はありますか?

ベストアンサー1

タイトルで尋ねられた一般的な質問の答えを探して Google 経由でここに来た人 (私もそうでした) のために、簡単なメモ/要約を記します。引用符内のシェル変数にアクセスするには、次のいずれかの方法が機能するはずです。

echo "$VARIABLE"
echo "${VARIABLE}"

シングルクォートの使用が主な問題です。Bash リファレンスマニュアル:

文字を一重引用符 ( ') で囲むと、引用符内の各文字のリテラル値が保持されます。一重引用符は、その前にバックスラッシュがあっても、一重引用符の間に出現することはできません。 [...] 文字を二重引用符 ( ") で囲むと、引用符内のすべての文字のリテラル値が保持されます。ただし$`\、 、 は例外で、履歴展開が有効になっている場合は です!。文字$および ` は、二重引用符内でも特殊な意味を保持します (「シェル展開」を参照)。バックスラッシュは、$`"\、または改行のいずれかの文字が続く場合にのみ、特殊な意味を保持します。二重引用符内では、これらの文字のいずれかが続くバックスラッシュは削除されます。特殊な意味を持たない文字の前のバックスラッシュは変更されません。二重引用符は、その前にバックスラッシュを置くことで、二重引用符内で囲むことができます。有効になっている場合は、!二重引用符内の がバックスラッシュを使用してエスケープされない限り、履歴展開が実行されます。 の前のバックスラッシュ!は削除されません。特殊パラメータ*およびは、@二重引用符で囲むと特別な意味を持ちます (シェルパラメータの展開を参照)。

質問で尋ねられた特定のケースでは、$COLUMNS は非標準のプロパティを持つ特別な変数です (上記の lhunath の回答を参照)。

おすすめ記事