2010-09-06 20 views

risposta

4

Il VAR variabile contiene -e xyz, se si accede tramite la variabile $ l'-e viene interpretato come una riga di comando l'opzione per l'eco. Tieni presente che il contenuto di $ VAR non viene inserito automaticamente in "".

Utilizzare echo "$ VAR" per risolvere il problema.

3

Prova:

echo "$VAR" 

invece.

(-e è un'opzione valida per echo - questo è ciò che causa questo fenomeno).

0

-e viene interpretato da bash come argomento per echo. Prova

echo "$VAR" 
37

Le risposte che dicono di mettere $VAR tra virgolette sono corrette solo per effetto collaterale. Cioè, quando messo tra virgolette, echo(1) riceve un singolo argomento di -e xyz, e poiché non è una stringa di opzioni valida, echo lo stampa. È un effetto collaterale poiché echo potrebbe facilmente stampare un errore relativo alle opzioni non valide. La maggior parte dei programmi lo farà, ma sembra GNU echo (da coreutils) e la versione integrata in bash fa semplicemente eco alle stringhe che iniziano con un trattino ma non sono stringhe di argomento valide. Questo comportamento non è documentato quindi non dovrebbe essere invocato.

Inoltre, se $VAR contiene un argomento echo un'opzione valida, quindi citando $ VAR non aiuterà:

$ VAR="-e" 
$ echo "$VAR" 

$ 

La maggior parte dei programmi GNU prendono -- come argomento a significare non più di elaborazione opzione - tutti gli argomenti dopo -- devono essere trattati come argomenti non opzionali. bash echo non supporta questo, quindi non è possibile utilizzarlo. Anche se lo facesse, non sarebbe portatile. echo ha altri problemi di portabilità (-n vs \c, no -e).

La soluzione corretta e portatile è quella di utilizzare printf(1).

printf "%s\n" "$VAR" 
+0

Risposta per lo più corretta. Sebbene lo standard POSIX affermi chiaramente che "le implementazioni non supporteranno alcuna opzione", storicamente parte delle implementazioni supporta le opzioni (violando lo standard). Quindi 'printf' è la soluzione giusta,' echo' dovrebbe essere usato per produrre stringhe costanti come "Hello world" che sai non contenere trattini o backslash. –

+0

Ottima risposta. Ho provato a capirlo per un po 'ora. grazie. –

+0

Se hai deciso di usare 'echo', puoi usare le sequenze di escape' echo -e '\ 055e''. – dosentmatter

Problemi correlati