echo $(cal) と echo "$(cal)" の違い

echo $(cal) と echo "$(cal)" の違い

echo $(cal)Linux でと を使用していますecho "$(cal)"が、図のように異なる結果になります。$この場合、二重引用符は に干渉しないはずなので、 とecho "$(cal)"比較して が水平スタイルになる理由は何でしょうかecho $(cal)

結果は次のとおりです。

出力のスクリーンショット

echo "$(cal)"

Su Mo Tu We Th Fr Sa  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
30

echo $(cal)

June 2019 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

答え1

主な違いは 2 つあります。

  1. シェルは単語の分割$(cal)引用符で囲まれていない に置きます。つまり、 のデフォルト値を想定すると、すべての空白文字列 (改行を含む) が 1 つの空白に置き換えられます。引用符IFSで囲まれていない コマンドからの出力は 1 行になります。

    より簡単な例を以下に示します。

    $ s='line     1
    > line  2'
    $ echo "$s"
    line     1
    line  2
    $ echo $s
    line 1 line 2
    

    ご覧のとおり、2 番目の (二重引用符なし)では、すべての連続した空白が単一の空白に置き換えられています。これは、 を二重引用符なしでecho使用したときに表示されたものとまったく同じです。echoecho $(cal)

  2. シェルはパス名の拡張単語分割の結果によります。この例では違いは生じませんが、出力に?または または*その他のグロブアクティブ文字が含まれている場合は、予期しない結果が生じる可能性があります。

    ここに簡単な例を挙げますパス名の拡張3 つのファイルを含むディレクトリから始めましょう。

    $ ls
    file1  file2  file3
    

    ここで、文字列を定義しましょう: $ s='file?'

    ここで、echo二重引用符を使用すると文字列が返されますが、二重引用符を使用しない場合は文字列がファイル名に展開されることがわかります。

    $ echo "$s"
    file?
    $ echo $s
    file1 file2 file3
    

関連情報