Warum iteriert die Bourne-Shell printf über ein %s-Argument?
Frage
Was ist denn hier los?
printf.sh:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
Befehlszeilensitzung:
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
AKTUALISIEREN: printf "Hello, %s\n" "$NAME"
funktioniert.Aus dem Grund, warum ich es nicht benutze echo
, halten
echo.sh:
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
Befehlszeile:
$ ./echo.sh
Filename: C: mp
Der POSIX-Spezifikation für echo
sagt: „Neue Anwendungen werden zur Nutzung ermutigt.“ printf
anstatt echo
" (aus diesem und anderen Gründen).
Lösung
Ihre NAME-Variable wird wie folgt ersetzt:
printf "Hello, %s\n" George W. Bush
Benutze das:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
Andere Tipps
Gibt es einen bestimmten Grund, warum Sie printf verwenden, oder würde Echo auch für Sie funktionieren?
NAME="George W. Bush"
echo "Hello, "$NAME
ergibt
Hello, George W. Bush
bearbeiten:Der Grund dafür ist die Wiederholung von „George W.Bush“ liegt daran, dass die Bourne-Shell durch Leerzeichen begrenzt ist.Um printf weiterhin verwenden zu können, müssen Sie $NAME in doppelte Anführungszeichen setzen
printf "Hello, %s\n" "$NAME"
Die Art und Weise, wie ich das interpretiere Manpage Betrachtet es die Zeichenfolge, die Sie ihm übergeben, als Argument?Wenn Ihre Zeichenfolge Leerzeichen enthält, wird davon ausgegangen, dass Sie mehrere Argumente übergeben.Ich glaube, dass ColinYounger Recht hat, wenn er die Variable in Anführungszeichen setzt, was die Shell dazu zwingt, die Zeichenfolge als einzelnes Argument zu interpretieren.
Eine Alternative könnte darin bestehen, printf die Variable erweitern zu lassen:
printf "Hello, $NAME."
Die Links gelten für Bash, aber ich bin mir ziemlich sicher, dass das Gleiche auch für Sh gilt.
Wenn Sie möchten, dass alle diese Wörter einzeln ausgedruckt werden, verwenden Sie drucken anstatt printf
printf übernimmt die Formatierungsspezifikation und wendet sie auf jedes Argument an, das Sie übergeben.Da Sie drei Argumente {George, W., Bush} haben, wird die Zeichenfolge dreimal mit den verschiedenen Argumenten ausgegeben.