ドル記号をエコーするにはどうすればよいですか?


67

たとえば$PATH$HOME

入力するecho $PATHとmy $PATHが返されますが$PATH、実際の変数の意味でecho "$PATH"はなく単語をエコーし​​たいのですが、動作しません。


はい、次のような単一引用符を使用しますecho '$PATH'。引用の詳細については、こちらこちらを
パンディア14年

@donはserverfaultでだまされただけです。私の悪い。
geedoubleya 14年


@StéphaneChazelasその質問は、この質問よりも2年近く新しいです。
DisplayName

@DisplayName、はい。ただし、「特殊文字Xの表示方法」をすべて網羅するための「標準的な」質問として意図されています。(特定の質問を閉じるためにこれらの「標準的な」カバー・イット・オール・アンサーが使用されているという考えが好きではありませんが、それが私がちょうど投票ではなくコメントとして追加した理由です。)
ステファンシャゼラス

回答:


77

あなただけのドルをエスケープする必要があり$ます。

echo \$PATH
$PATH

または、単一引用符で囲みます。

echo '$PATH'
$PATH

これにより、単語がシェルによって解釈されなくなります。


1
おかげでecho -e、manページには何も書かれていませんでした。
DisplayName 14年

-eフラグは、例えば、拡張するために使用される\tリテラルのタブ文字に。パラメータの拡張を防ぐためにドル記号をエスケープすることは関係ありません。
chepner

2
これは、ファイルに送信する場合は機能しません。echo '\$PATH' >> output.txt「/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin:/ usr / games:/ usr / local / games:/ opt / vc / bin」がファイルに書き込まれます、「$ PATH」ではありません。
セリン

2
非常に興味深いのは、単一引用符とエスケープ文字を使用している場合、\ $ PATHをエコーするだけです。エコーコマンドのソースはどのOS /パッケージですか?
geedoubleya

あなたのための@Cerinは、@ステファンの答えは働いていたecho '\044*' > first.txt、それは意志first.txtで出力する$ *
MAQ

20

$ほとんどのシェルの構文では、非常に特殊な文字です。Bourneのようなシェルのみを見ると、以下を紹介するために使用されます。

  1. のように、パラメータ展開$#$var${foo:-bar}
  2. のようなコマンド置換$(logname)${ logname;}サブシェルを回避するための一部のシェルでも)
  3. 算術展開$((1+1))$[1+1]一部のシェルでも同様)。
  4. $'\n'またはのようないくつかのシェルで引用する他の形式$"localized string"

最後のケースを除き、これらの拡張/置換はまだ(と内部の二重引用符内部で発生$"..."bashまたはksh93

それ$が特別に扱われるのを防ぐには、次のいずれかで引用する必要があります。

  • 単一引用符:echo '$PATH'またはecho '$'PATH。通常、ほとんどのシェルですべての文字(それ自体を除く)をエスケープするために使用するものです。
  • ブラックスラッシュ:echo \$PATH。二重引用符内:echo "\$PATH"
  • 一部のシェルでは、他の引用演算子:echo $'$PATH'echo $'\44PATH'(ASCII互換の文字セットを想定)、echo $'\u0024'

または、上記の有効な拡張形式の一部ではないことを確認してください。

  • echo "$"PATH
  • echo $""PATHecho $"PATH"。いくつかのシェルが好きなので、それらを避けるべきであるksh93bashサポートして$"..."引用符の形を。
  • echo $``PATH。それが可能であることを示す以外に、あなたがそれを使用したい理由はありません。
  • echo "${$+$}PATH" その他の複雑なもの...

または、$別の方法で出力することもできます:

  • Unix準拠の場合echo:(echo '\044PATH'echoの一部が必要echo -e '\044PATH'
  • printf '\44PATH\n'
  • 猫<< \ EOF
    $ PATH
    EOF

これらのバックスラッシュも、シェルにとって明らかに特別であるため、引用符で囲む必要があることに注意してください。

これまでに多くの方法がありますが、echo '$PATH'ここ以外で使用したい理由はないことが明確になっているはずです。


1

二重引用符内のリテラル$は問題になる可能性があることに注意してください。次のように、二重引用符の外側に$を生成することで実行できます。

echo "My terminal is $term, first file found in /dev is </dev/`ls /dev | head -n 1`>, the
dollar symbol is '"`echo '$'`"', and a newspaper costs "`echo '$'`"2.50."

or like this:

echo "$term is the value of "'$term'

出力:

My terminal is xterm, first file found in /dev is </dev/acpi>, the dollar symbol
is '$', and a newspaper costs $2.50.

xterm is the value of $term

またはecho "$term is the value of \$term"、別の回答ですでに説明したように。またはprintf '%s is the value of $term\n' "$term"とにかくecho、任意のデータには使用しないでください。
ステファンシャゼラス

-2

つかいます:

echo ''\$PATH'' >> output.txt 

これは動作します。


2
ダウン投票コメントを追加してください
アンドレアス・時間

2
それともec""h'''o''' ''""''\$P''A""TH''
ステファンChazelas

この答えが何を試みているのか分かりません。答えは、\ $または一重引用符を使用することです。echo '$ PATH'は$ PATHを出力しますecho '\ $ PATH'は\ $ PATHを出力しますecho "\ $ PATH"は$ PATHを出力しますecho '' \ $ PATH ''は技術的に正しいことを行いますが、2つのヌル文字列は目的はありません。
bobpaul
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.