Unterschied zwischen echo $(cal) und echo "$(cal)"

Unterschied zwischen echo $(cal) und echo "$(cal)"

Ich verwende echo $(cal)und echo "$(cal)"in Linux und bekomme andere Ergebnisse als im Bild. Die doppelten Anführungszeichen sollten $in diesem Fall nicht stören, also was bringt der echo "$(cal)"horizontale Stil im Vergleich zu echo $(cal).

Dies ist das Ergebnis:

Screenshot der Ausgabe

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

Antwort1

Es gibt zwei wesentliche Unterschiede:

  1. Die Schale leistetWorttrennungauf dem nicht in Anführungszeichen gesetzten $(cal). Dies bedeutet, dass bei einem angenommenen Standardwert für IFSalle Leerzeichen (einschließlich Zeilenumbrüche) durch ein einzelnes Leerzeichen ersetzt werden. Dies ist die Ausgabe des nicht in Anführungszeichen gesetzten Befehls in einer einzelnen Zeile.

    Hier ist ein einfacheres Beispiel:

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

    Wie Sie sehen, wurden im zweiten echo, dem ohne Anführungszeichen, alle Leerzeichen durch einfache Leerzeichen ersetzt. Dies ist genau das, was Sie bei der Verwendung echoohne Anführungszeichen mit gesehen haben echo $(cal).

  2. Die Schale leistetPfadnamenerweiterungvom Ergebnis der Wortaufteilung. Dies macht in Ihrem Beispiel keinen Unterschied, aber wenn Ihre Ausgabe ?oder *andere glob-aktive Zeichen enthält, könnte dies zu einigen Überraschungen führen.

    Hier ist ein einfaches Beispiel fürPfadnamenerweiterungBeginnen wir mit einem Verzeichnis mit drei Dateien:

    $ ls
    file1  file2  file3
    

    Definieren wir nun eine Zeichenfolge: $ s='file?'

    Beachten Sie nun, dass echomit Anführungszeichen unser String zurückgegeben wird, ohne Anführungszeichen jedoch der String in Dateinamen erweitert wird:

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

verwandte Informationen