Perché la shell Bourne printf scorrere un %s argomento?
Domanda
Che cosa sta succedendo qui?
printf.sh:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
Sessione di linea di comando:
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
AGGIORNAMENTO: printf "Hello, %s\n" "$NAME"
opere.Perché io non lo uso echo
, prendere in considerazione
echo.sh:
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
Riga di comando:
$ ./echo.sh
Filename: C: mp
Il POSIX spec per echo
dice: "le Nuove applicazioni sono incoraggiati ad utilizzare printf
invece di echo
"(per questo e per altri motivi).
Soluzione
Il tuo NOME variabile viene sostituito come questo:
printf "Hello, %s\n" George W. Bush
Uso questo:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
Altri suggerimenti
c'è un motivo specifico che si sta utilizzando printf o avrebbe fatto eco il lavoro per voi?
NAME="George W. Bush"
echo "Hello, "$NAME
risultati in
Hello, George W. Bush
edit:Il motivo è l'iterazione su "George W.Bush" è perché la shell bourne è spazio delimitted.Per continuare a utilizzare printf devi mettere $NOME tra virgolette doppie
printf "Hello, %s\n" "$NAME"
Il modo di interpretare i pagina man si ritiene che la stringa si passa da un argomento;se la stringa ha spazi si pensa che si sta passando più argomenti.Credo ColinYounger è corretto, circondando l'variabile tra virgolette, che impone la shell di interpretare la stringa come un unico argomento.
Un'alternativa potrebbe essere quella di lasciare printf espandere la variabile:
printf "Hello, $NAME."
I link sono per bash, ma sono abbastanza sicuro che lo stesso vale per i pesci.
Se si desidera che tutte quelle parole per essere stampato in proprio, utilizzare stampa invece di printf
printf prende la formattazione specifica e si applica ad ogni argomento che si passa.Dal momento che si dispone di tre argomenti, {George W. Bush}, restituisce la stringa di tre volte, usando i vari argomenti.