Confusión con el comando printf?

13

Tengo que imprimir las siguientes tres líneas en un comando de impresión sin usar el comando echo. Así que elegí el comando printf. Aquí están las tres líneas:

  Different characters can be represented and supported 
  in the print command, for example: 
  x-y, X+Y, –, +, <, >, %, $, #, &.

Lo que he hecho hasta ahora es:

   printf "
   Different characters can be represented and supported 
   in the print command, for example: 
   x-y, X+Y, –, +, <, >, %, $, #, &.
   "

Pero recibí un error bash para la tercera línea ','.

Entonces, ¿alguien me iluminará?

Narwen
fuente
Por cierto, hay una diferencia entre el printcomando y el printfcomando.
Flimm

Respuestas:

12

Mejor usar:

printf "Different characters can be represented and supported\n\
in the print command, for example:\n\
x-y, X+Y, –, +, <, >, %%, $, #, &.\n"

Obtiene ese error, como otros han dicho aquí, debido al %carácter que es especial y debe ser escapado.

Ver man 1 printfpara más información.

Radu Rădeanu
fuente
@Narwen Te sugiero que uses al hombre todo el tiempo cuando tengas que jugar con personajes especiales. Para buscar en man, escriba /your_string_to_searchy luego presione Intro.
Radu Rădeanu
44
¡El punto printfes ese %personaje y lo que hace!
Kaz
14

%es un carácter especial en printf. Eso es lo que está causando el error. Necesitas escapar de eso como %%.

$también puede ser sustituido dentro de comillas dobles por la capa externa, por lo que debe escapar de eso ( \$). Por lo general, es más fácil usar comillas simples.

Oli
fuente
55
El signo de dólar solo es especial cuando va seguido de un nombre de variable válido, que no es el caso aquí.
Glenn Jackman
1
$variablese reemplaza por el shell, no por printf. Si rodea su cadena con comillas simples en lugar de comillas dobles, $el shell no será interpolado y pasará directamente a printf.
Flimm
@glennjackman Además de ser especial cuando va seguido de un nombre de variable válido (ya sea que esa variable esté realmente definida o no), $también es especial cuando va seguido de{ o por un símbolo de parámetro especial , o uno o más dígitos . Sin embargo, la idea básica de lo que estás diciendo es correcta.
Eliah Kagan el
9

the %es especial para printf: es el principal char en especificadores de formato. Si desea un porcentaje literal, use%%

Glenn Jackman
fuente
9

Es un poco sorprendente ver que cuando no se te permite usar el echocomando, eliges usar el printfcomando en su lugar.

¿Por qué no cat?

#!/bin/bash

cat<<'EOF'
Different characters can be represented and supported
in the print command, for example:
x-y, X+Y, –, +, <, >, %, $, #, &.
EOF
thom
fuente
Pero tuve que reemplazar echo con el comando de impresión según la pregunta. Pero gracias por la ayuda.
Narwen
2
Para evitar interpretar cadenas como $fooen el texto, use en cat <<'EOF'lugar de cat <<EOF.
Lekensteyn
4

printfes una impresión formateada que toma una cadena de formato como primer parámetro. El resto de los parámetros se utilizan en la cadena de formato. Las tres cosas para recordar al usar printfson:

  1. Aunque muchos lenguajes tienen printfdeclaraciones / comandos / funciones, todos difieren un poco, así que siempre verifique los detalles en la documentación específica del lenguaje (C, bash, php, perl, etc.),

  2. Nunca debe usar la información proporcionada por el usuario en la cadena de formato. Esto siempre es una falla de seguridad. Si desea mostrar una cadena proporcionada por el usuario, use una cadena de formato como"%s" .

  3. Tanto la barra diagonal inversa ( \) como el signo de porcentaje ( %) son caracteres de escape que cambian el significado de los siguientes caracteres si desea que aparezca un carácter de escape en su salida, se debe escapar o extraer de otro parámetro. El signo de dólar ( $) no es especial para printf, pero es especial para el shell, así que tenga cuidado con sus citas.

printfes ideal para formatear números. mira las páginas del manual para más detalles

hildred
fuente
2

Como otros han mencionado, el %símbolo es especial paraprintf .

Si solo desea imprimir una cadena como es, dele printf %scomo primer argumento, y la cadena entre comillas simples como segundo argumento:

printf %s '
Different characters can be represented and supported 
in the printf command, for example: 
x-y, X+Y, –, +, <, >, %, $, #, &.
'

El uso de comillas simples en lugar de comillas dobles evita que el shell interpole símbolos como $.

Flimm
fuente