%20und%20echo%20%22%24(cal)%22%20.png)
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:
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:
Die Schale leistetWorttrennungauf dem nicht in Anführungszeichen gesetzten
$(cal)
. Dies bedeutet, dass bei einem angenommenen Standardwert fürIFS
alle 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 Verwendungecho
ohne Anführungszeichen mit gesehen habenecho $(cal)
.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
echo
mit 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