VAR="-e xyz"
echo $VAR
Questa stampa "xyz", per qualche motivo. Non riesco a trovare un modo per ottenere una stringa per iniziare con -e.Bash: stringa echo che inizia con "-"
Cosa sta succedendo qui?
VAR="-e xyz"
echo $VAR
Questa stampa "xyz", per qualche motivo. Non riesco a trovare un modo per ottenere una stringa per iniziare con -e.Bash: stringa echo che inizia con "-"
Cosa sta succedendo qui?
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.
Prova:
echo "$VAR"
invece.
(-e
è un'opzione valida per echo
- questo è ciò che causa questo fenomeno).
-e
viene interpretato da bash come argomento per echo. Prova
echo "$VAR"
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"
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. –
Ottima risposta. Ho provato a capirlo per un po 'ora. grazie. –
Se hai deciso di usare 'echo', puoi usare le sequenze di escape' echo -e '\ 055e''. – dosentmatter