Differenza tra echo -e “<stringa>” ed echo $ “<stringa>”


20

Qual è la differenza tra l'utilizzo

echo -e "Hello\nWorld" 

e

echo $"Hello\nWorld" 

non producono entrambi:

Hello
World

1
Hai provato? Il secondo esce Hello\nWorld. È necessario l' -einterruttore per interpretare i caratteri di escape.
becko,

4
Per il secondo, ho il sospetto che tu intendessi scriverlo con virgolette singole echo $'Hello\nWorld', che verranno stampate su due righe sotto bash.
Giovanni 1024,

@becko, sì, l'ho provato ed entrambi hanno prodotto la stessa cosa esatta.
Segna il

Risposte:


33

echo -ee echo $'...'sono entrambi simili in quanto supportano le seguenti sequenze di escape:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Hanno delle differenze. Oltre a quanto sopra, echo -esupporta:

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

Al contrario, $'....'supporta:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

Si noti che, tra i due, le \cestensioni sono incompatibili:

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

Per quanto echo -esopra, \csopprime l'ulteriore output, ignorando così il Istop. Al contrario, per $'...', \cIviene interpretato come una scheda.

La forma visivamente simile: $"..."

Al contrario $'...', la funzione di $"..."è piuttosto diversa. Provocherà la traduzione della stringa che contiene in base alle impostazioni internazionali correnti.

La echo -epolemica

echo -enon è universalmente supportato da shell e molti considerano l' -eopzione come un errore di progettazione. Osservare:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

Come puoi vedere, se ciò che stai stampando echoinizia con un trattino, i risultati possono essere inattesi. A meno che non si sia certi che la prima stringa con cui si stamperà echonon inizi con un trattino, è probabile che sia meglio utilizzarla printf.

Per questi motivi, lo standard POSIX conclude :

Le nuove applicazioni sono incoraggiate a utilizzare printf anziché echo.

Chet Ramey, che ha mantenuto bashnegli ultimi 22 anni, concorda :

[N] Il codice ew dovrebbe usare printf.


1
Vale anche la pena notare che sia Chet che POSIX raccomandano di utilizzare printfpiuttosto cheecho
geirha il

@geirha Punti molto buoni. Risposta aggiornata
Giovanni 1024,

1
Il problema di opzioni inattese da globs (come *) non è in realtà specifico echo. Accade con qualsiasi comando che riconosca le opzioni brevi o lunghe (scritte in modo tradizionale) e accetta gli operandi di nome file, inclusols . Probabilmente la situazione è un po 'peggiore in echoquanto (come dice la tua fonte) in echogenere non accetta --di indicare la fine delle opzioni, mentre si possono scrivere comandi simili ls -- *l. (E in realtà si dovrebbe solitamente scrivere comandi in quel modo, quando si usano globs che iniziano con *o -, soprattutto negli script.)
Eliah Kagan,

Grazie per la risposta esauriente, ho un'esercitazione per il mio corso di Sistemi Operativi e avevo bisogno di stampare un testo utilizzando la \nsequenza di escape, quindi in realtà non importa se uso echo -e '...', echo $'...'oecho $"..."
Mark
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.