Mentre la soluzione ovvia, standard e raccomandata è di usare printf, farlo con echopuò essere abbastanza complicato a seconda dell'implementazione (non così complicato come -nse).
Conformità POSIX.2017 echos
POSIX richiede echo -e l'output -e<newline>. Quindi è giusto
echo -e
Là. Le norme POSIX echoa tale riguardo (la maggior parte di esse non è conforme a POSIX per altri aspetti, le specifiche POSIX sono quasi inutili quando si tratta di echo) includono:
- l'
echointegrato di bashquando entrambe le opzioni xpg_echoe posixsono state abilitate (in fase di runtime o di costruzione come per /bin/shApple macOS). set -o posix; shopt -s xpg_echo(l' posixopzione può anche essere abilitata se invocata come sho quando POSIXLY_CORRECTo SHELLOPTS=posixè nell'ambiente).
- la
/bin/echodei sistemi certificati UNIX (AIX, MacOS, Solaris almeno) e la maggior parte BSD
- il
echobuiltin di dash, ksh88la shell Bourne, csh, tcsh, elegante, rc, es, akanga
- GNU
echo( /bin/echosu sistemi GNU) quando si POSIXLY_CORRECTtrova nell'ambiente.
- il
echobuiltin di mkshe qualche altro pdksh-deriva quando la loro posixopzione è abilitata.
- la
echobuiltin di yashquando $ECHO_STYLEè o disinserito o uno SYSV, XSI, BSD, DASH,RAW
implementazioni che supportano -e
Comprende echola ricerca Unix V8 (da dove proviene), GNU, busybox, il echobuiltin di bash, zsh, pdkshe derivati, fishalcune ashconchiglie basati su come busybox sho shdi alcuni BSD, le versioni recenti di ksh93(su alcuni sistemi, e con alcuni valori di $PATH) con le loro impostazioni predefinite, yashcon $ECHO_STYLEuno di GNUo ZSH:
echo -e '-e\n\c'
Le implementazioni che supportano -einvariabilmente supportano -n, quindi:
echo -ne '-e\n'
funzionerebbe pure.
zsh
zshQuesta echoè l'unica implementazione che conosco che supporta un marker di fine opzione ( -).
echo - -e
Rendendolo l'unica shell tipo Bourne echoche può generare dati arbitrari (anche perché è l'unico che supporta byte NUL nelle sue variabili e gli argomenti dei suoi builtin) con echo -E - "$data")
Fatta eccezione per il problema del byte NUL, altre implementazioni che possono generare dati arbitrari sono FreeBSD o macOS /bin/echodove puoi fare:
/bin/echo "$data
\c"
(in tale implementazione, \cviene riconosciuto solo alla fine e non è supportata alcuna altra sequenza di escape).
E yash':
ECHO_STYLE=RAW echo "$data"
(sebbene si noti che le yashvariabili possono contenere solo testo, quindi non sequenze di byte arbitrarie in locali in cui non tutte le sequenze di byte possono formare caratteri validi come quelli che usano UTF-8 come loro charmap).
echoè di solito una shell incorporata, ma di solito c'è anche/usr/bin/echo. Non-eè POSIX, ma disponibile ad es. Con bash. Fornisci maggiori dettagli su cosa intendi con "non funzionano ancora". Qual è il comportamento previsto?