2008-09-03 22 views
6

¿Qué está pasando aquí?¿Por qué Bourne shell printf itera sobre un argumento% s?

printf.sh: sesión de línea de

#! /bin/sh 
NAME="George W. Bush" 
printf "Hello, %s\n" $NAME 

Comando:

$ ./printf.sh 
Hello, George 
Hello, W. 
Hello, Bush 

ACTUALIZACIÓN: printf "Hello, %s\n" "$NAME" obras. Por qué no estoy usando echo, considere

echo.sh:

#! /bin/sh 
FILE="C:\tmp" 
echo "Filename: $FILE" 

de línea de comandos:

$ ./echo.sh 
Filename: C: mp 

El POSIX spec for echo dice: "Se anima a nuevas aplicaciones para usar en lugar de printfecho "(por esta y otras razones).

+0

bash builtin echo no reemplaza \ de manera predeterminada, pero el shell POSIX (por ejemplo, dash) echo lo hace, como indica su enlace a la especificación.Ya que está usando un shell de todos modos, puede simplemente imprimir "Hello, $ NAME \ n" –

+0

En realidad, usar% s es probablemente un buen hábito, por razones de seguridad y corrección. printf hará \ reemplazo y otras cosas en la cadena de formato, así que mantenga las variables fuera de este cuando sea posible. –

Respuesta

6

La variable de nombre está siendo sustituido como esto:

printf "Hello, %s\n" George W. Bush 

Utilice esta:

#! /bin/sh 
NAME="George W. Bush" 
printf "Hello, %s\n" "$NAME" 
0

Si quieres todas esas palabras que se debe imprimir por su cuenta, utilice de impresión en lugar de printf

printf toma la especificación de formato y lo aplica a cada argumento que se pasa en. Como tiene tres argumentos {George, W., Bush}, emite la cadena tres veces usando los diferentes argumentos.

+0

imprimir (1) es para imprimir un archivo en una impresora, después de verificar su tipo mime. No es un shell incorporado en bash. –

1

¿Existe alguna razón específica por la que esté utilizando printf o también podría funcionar para usted?

NAME="George W. Bush" 
echo "Hello, "$NAME 

resultados en

Hello, George W. Bush 

edición: La razón de que se itera sobre "George W. Bush" es porque el shell Bourne es el espacio delimitted. Para seguir usando printf usted tiene que poner $ nombre entre comillas dobles

printf "Hello, %s\n" "$NAME" 
1

La manera en que yo interpreto el man page considera que la cadena que pasa es un argumento; si su cadena tiene espacios, cree que está pasando múltiples argumentos. Creo que ColinYounger es correcto al rodear la variable con comillas, lo que obliga al shell a interpretar la cadena como un único argumento.

Una alternativa podría ser la de dejar que printf expanda la variable:

printf "Hello, $NAME." 

Los links son para fiesta, pero estoy bastante seguro de que lo mismo vale para los peces.

+0

No, no hay "eso piensa". HIZO pasar múltiples argumentos, porque no citó la expansión de $ NAME en el comando printf. El caparazón lo expandió, luego lo dividió en palabras, luego pasó los 3 argumentos a printf. Pero como dices, ColinYounger tiene razón. –

Cuestiones relacionadas