¿Por qué el shell Bourne printf itera sobre un argumento %s?
Pregunta
¿Que está pasando aqui?
printf.sh:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
Sesión de línea de comando:
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
ACTUALIZAR: printf "Hello, %s\n" "$NAME"
obras.Por qué no estoy usando echo
, considerar
eco.sh:
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
Línea de comando:
$ ./echo.sh
Filename: C: mp
El especificación POSIX para echo
dice: "Se anima a las nuevas aplicaciones a utilizar printf
en lugar de echo
" (por esta y otras razones).
Solución
Su variable NOMBRE se sustituye así:
printf "Hello, %s\n" George W. Bush
Utilizar esta:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
Otros consejos
¿Hay alguna razón específica por la que estás usando printf o echo también funcionaría para ti?
NAME="George W. Bush"
echo "Hello, "$NAME
resultados en
Hello, George W. Bush
editar:La razón por la que se repite sobre "George W.Bush" se debe a que el shell bourne está delimitado por un espacio.Para seguir usando printf tienes que poner $NAME entre comillas dobles
printf "Hello, %s\n" "$NAME"
La forma en que interpreto el página de manual ¿Considera que la cadena que le pasa es un argumento?si su cadena tiene espacios, cree que está pasando varios argumentos.Creo que ColinYounger tiene razón al rodear la variable entre comillas, lo que obliga al shell a interpretar la cadena como un argumento único.
Una alternativa podría ser dejar que printf expanda la variable:
printf "Hello, $NAME."
Los enlaces son para bash, pero estoy bastante seguro de que lo mismo ocurre con sh.
Si desea que todas esas palabras se impriman solas, utilice imprimir en lugar de imprimirf
imprimirf toma la especificación de formato y la aplica a cada argumento que pasa.Como tiene tres argumentos {George, W., Bush}, genera la cadena tres veces usando los diferentes argumentos.