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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top