Confusione con il comando printf?


13

Devo stampare le tre righe seguenti in un comando di stampa senza usare il comando echo. Quindi ho scelto il comando printf. Ecco le tre righe:

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

Quello che ho fatto finora è:

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

Ma ho ottenuto l'errore bash per la terza riga ','.

Quindi qualcuno mi illuminerà.


A proposito, c'è una differenza tra il printcomando il printfcomando.
Flimm,

Risposte:


12

Meglio usare:

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

Si ottiene questo errore, come altri hanno già detto qui, a causa del %carattere che è speciale e deve essere evitato.

Vedi man 1 printfper maggiori informazioni.


@Narwen Ti consiglio di usare sempre l'uomo quando devi giocare con personaggi speciali. Per cercare in man, digitare /your_string_to_searche quindi premere Invio.
Radu Rădeanu,

4
Il punto centrale di printfquel %personaggio è quello che fa!
Kaz,

14

% è un personaggio speciale in printf . Questo è ciò che causa l'errore. Devi scappare come %%.

$può anche essere sostituito quando si trova tra virgolette doppie dalla shell esterna, quindi dovresti sfuggire a quello ( \$). Di solito è solo più semplice usare le virgolette singole.


5
Il simbolo del dollaro è speciale solo quando è seguito da un nome di variabile valido che non è il caso qui.
Glenn Jackman,

1
$variableè sostituito dalla shell, non da printf. Se la stringa viene racchiusa tra virgolette singole anziché doppie, $non verrà interpolata dalla shell e verrà passata direttamente a printf.
Flimm,

@glennjackman Oltre ad essere speciale quando seguito da un nome di variabile valido (indipendentemente dal fatto che quella variabile sia effettivamente definita), $è anche speciale quando seguito da{ o da un simbolo di parametro speciale o da una o più cifre . L'idea di base di ciò che stai dicendo è corretta, però.
Eliah Kagan,

9

il %è speciale per printf: è il carattere principale in identificatori di formato. Se vuoi una percentuale letterale, usa%%


9

È un po 'sorprendente vedere che quando non ti è permesso usare echo comando hai scelto di usare printfinvece il comando.

Perché no cat?

#!/bin/bash

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

Ma ho dovuto sostituire l'eco con il comando di stampa in base alla domanda. Ma grazie per l'aiuto.
Narwen,

2
Per evitare di interpretare stringhe come $foonel testo, utilizzare cat <<'EOF'invece di cat <<EOF.
Lekensteyn,

4

printfè una stampa formattata che accetta una stringa di formato come primo parametro. Il resto dei parametri viene utilizzato nella stringa di formato. Le tre cose da ricordare durante l'utilizzo printfsono:

  1. Anche se molte lingue hanno printf istruzioni / comandi / funzioni, differiscono tutte un po ', quindi verifica sempre i dettagli nella documentazione specifica della lingua (C, bash, php, perl, ecc.),

  2. Non utilizzare mai le informazioni fornite dall'utente nella stringa di formato. Questo è sempre un difetto di sicurezza. Se si desidera visualizzare una stringa fornita dall'utente, utilizzare una stringa di formato simile"%s" .

  3. Sia la barra rovesciata ( \) che il segno di percentuale ( %) sono caratteri di escape che cambiano il significato dei seguenti caratteri se si desidera che un carattere di escape appaia nell'output, deve essere salvato o estratto da un altro parametro. Il simbolo del dollaro ( $) non è speciale per printf, ma è speciale per la shell, quindi fai attenzione alle tue virgolette.

printfè ottimo per la formattazione dei numeri. guarda le pagine man per i dettagli


2

Come altri hanno già detto, il %simbolo è speciale perprintf .

Se vuoi solo stampare una stringa così com'è, dai printf %scome primo argomento e la stringa racchiusa tra virgolette singole come secondo argomento:

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

L'uso di virgolette singole invece di doppie virgolette impedisce alla shell di interpolare simboli come $.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.