Por que o shell Bourne printf itera sobre um argumento %s?
Pergunta
O que está acontecendo aqui?
imprimirf.sh:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
Sessão de linha de comando:
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
ATUALIZAR: printf "Hello, %s\n" "$NAME"
funciona.Por que não estou usando echo
, considere
eco.sh:
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
Linha de comando:
$ ./echo.sh
Filename: C: mp
O Especificação POSIX para echo
diz: "Novos aplicativos são incentivados a usar printf
em vez de echo
" (por este e outros motivos).
Solução
Sua variável NAME está sendo substituída assim:
printf "Hello, %s\n" George W. Bush
Usa isto:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
Outras dicas
existe um motivo específico para você estar usando printf ou echo funcionaria para você também?
NAME="George W. Bush"
echo "Hello, "$NAME
resulta em
Hello, George W. Bush
editar:A razão pela qual está iterando sobre "George W.Bush" é porque a concha bourne é delimitada pelo espaço.Para continuar usando printf você deve colocar $NAME entre aspas duplas
printf "Hello, %s\n" "$NAME"
A forma como interpreto o página de manual considera a string que você passa como um argumento;se sua string tiver espaços, ela pensa que você está passando vários argumentos.Acredito que ColinYounger está correto ao colocar a variável entre aspas, o que força o shell a interpretar a string como um único argumento.
Uma alternativa poderia ser deixar printf expandir a variável:
printf "Hello, $NAME."
Os links são para o bash, mas tenho certeza de que o mesmo vale para o sh.
Se você quiser que todas essas palavras sejam impressas sozinhas, use imprimir em vez de imprimir
imprimir pega a especificação de formatação e a aplica a cada argumento que você passa.Como você tem três argumentos {George, W., Bush}, ele gera a string três vezes usando argumentos diferentes.