使い方に環境変数の中に引用した文字列Bash
-
20-08-2019 - |
質問
たってさまざまな形に関する記述があります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"
う方に。
解決
不明な場合は、ターミナルで 'cols'リクエストを使用し、COLUMNSを忘れる可能性があります:
COLS=$(tput cols)
他のヒント
タイトルで尋ねられた一般的な質問への答えを探してGoogle経由でここに来た人のための簡単なメモ/要約(私がそうだったように)。引用符内のシェル変数にアクセスするには、次のいずれかが機能するはずです。
echo "$VARIABLE"
echo "${VARIABLE}"
一重引用符の使用が主な問題です。 Bashリファレンスマニュアル:
文字を一重引用符(
'
)で囲むと、引用符内の各文字のリテラル値が保持されます。バックスラッシュが先行する場合でも、単一引用符の間に単一引用符が発生しない場合があります。 [...] 文字を二重引用符("
)で囲むと、$
、`
、\
、および履歴展開が有効な場合は!
を除き、引用符内のすべての文字のリテラル値が保持されます。文字*
および `は、二重引用符で囲まれた特別な意味を保持します(シェル拡張を参照)。バックスラッシュは、@
、<=>、<=>、<=>、または改行のいずれかの文字が続く場合にのみ、特別な意味を保持します。二重引用符内では、これらの文字のいずれかが後に続くバックスラッシュは削除されます。特別な意味のない文字の前のバックスラッシュは変更されません。二重引用符は、二重引用符の前にバックスラッシュを付けることで引用できます。有効にすると、二重引用符で囲まれた<=>がバックスラッシュを使用してエスケープされない限り、履歴展開が実行されます。 <=>の前のバックスラッシュは削除されません。 特別なパラメーター<=>および<=>は、二重引用符で囲まれている場合に特別な意味を持ちます(シェルパラメーターの展開を参照)。
質問で尋ねられた特定のケースでは、$ COLUMNSは非標準のプロパティを持つ特別な変数です(上記のlhunathの答えを参照)。
COLUMNS
は次のとおりです。
- 環境変数ではありません。これは、bash自体によって設定される通常のbashパラメーターです。
-
SIGWINCH
信号を受信すると自動的に設定されます。
2番目のポイントは通常、stdin
変数はインタラクティブシェルでのみ設定され、bashスクリプトでは では設定されないことを意味します。
スクリプトの"$@"
が端末に接続されている場合、端末に問い合わせることにより、手動で端末の幅を調べることができます:
tput cols
そしてSVNコマンドでこれを使用するには:
svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"
(注:引用 eval
して、<=> ;-)から離れてください)
以下のスクリプトの作品が私のために複数の値の $COLUMNS
.うでない場合の設定 COLUMNS
この電話のかけ方は?
#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
きのエコー $COLUMNS
内部スクリプトが正しくセットされていますか。
あなたはそれを正しくやっているので、何か他のものが間違っていると思います(COLUMNSをエクスポートしていないのですか?)
これらのケースをデバッグするためのコツは、特殊なコマンド(プログラミング言語の開発者向けのクロージャー)を作成することです。 diff-columns doingという名前のシェルスクリプトを作成します。
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
そしてただ使用する
svn diff "$@" --diff-cmd diff-columns
これにより、コードが読みやすくなり、モジュール式になり(トップダウンアプローチ)、diff-columnsコードを個別にテストできます(ボトムアップアプローチ)。