2016-12-06 10 views
1

は、私はシェルコマンド言語のメカニズムを引用知っている私のおもちゃのプログラムシェル出力の複数行のテキストがbashの下にありますか?以下

[email protected]:~/Desktop$ foo=$'line1\nline2' 
[email protected]:~/Desktop$ echo $foo 
line1 line2 
[email protected]:~/Desktop$ echo "$foo" 
line1 
line2 

です。私の期待は、2つのエコーコマンドは同じことを出力します。ドル記号は、とにかくplaintextとdouble qoutingのメタクラッタです。それでなぜ違うのですか?それはいくつかの入れ子の入れ墨ですか?

+1

@DevNullありがとう、私はこの方法を知っていた。私の本当の問題は、なぜecho $ fooとecho "$ foo"がここで異なって振る舞うかです。 – nathan

+0

ああ、受け入れられた答えを見た後、私はあなたが探していたものを見ます。まあ、それはそれ自体がうまくいってうれしい。乾杯! – DevNull

答えて

3

引用されたと引用符で囲まれていないバージョンの違いは、シェルに依存するが、最も可能性が高いことがあります。

引用され
  • "$foo"は続き、それがそのまま印刷しechoコマンドに渡される、1つの引数を表し改行によって。
  • 引用符なし、$fooは、$IFSで区切られた一連の引数に展開されます。 $IFSが設定されていない場合はデフォルトで空白になり、フィールド区切り文字がない場合は1つのフィールドしかありません。引用符で囲まれていないバージョンで

、それも本当にechoコマンドへ入力の一部ではないとして改行は、出力の一部とみなされることを期待する理由はありません。単に引数を区切ります。

この動作を変更する場合は、$IFSの設定を変更することはできますが、お勧めしません。フィールドを処理する必要がある場合はIFSを変更し、出力をフォーマットすることはできません。

出力を予測するには、POSIX.1の推奨に従い、echoをまったく使用しないでください。代わりにprintfを使用してください。

+1

'IFS'を使用して、配列項目(' "$ {array [*]}" ')や' '$ *" 'でフィールドセパレータとして出力をフォーマットすることは正当ですが、二重引用符。 – cdarke

+2

@ghotiありがとうございます。私はあなたが正しいと思います。私もあなたのexplainationを確認した$ line1 \ tline2を試しました – nathan

+1

FYI、これは公式の文書だと思います。 "ダブルクォート内でパラメータ拡張が発生した場合: 拡張結果に対してパス名の拡張を行わない。 拡張の結果に対してフィールド分割を実行してはならない。ただし、 '@'は例外である。 " – nathan

関連する問題