Risposte:
echo -e ' \t '
farà eco a "spazio tab spazio newline" ( -e
significa "abilita l'interpretazione di backslash escape"):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
non funziona da Makefiles?
echo -e
non è POSIX e le make
chiamate /bin/sh
che normalmente non sono utilizzate dal programma vengono utilizzate in modo interattivo e normalmente non sono state -e
implementate. Per la portabilità, utilizzare printf '\t'
invece.
man
pagina per il echo
comando non menziona l'opzione -e
. Tuttavia, questa opzione è accettata.
Usa printf
, no echo
.
Esistono diverse versioni del echo
comando. C'è /bin/echo
(che può essere o meno la versione GNU Coreutils, a seconda del sistema), e il echo
comando è integrato nella maggior parte delle shell. Versioni diverse hanno modi diversi (o in nessun modo) di specificare o disabilitare le escape per i caratteri di controllo.
printf
d'altra parte, ha molte meno variazioni. Può esistere come comando, in genere /bin/printf
, ed è incorporato in alcune shell (bash e zsh ce l'hanno, tcsh e ksh no), ma le varie versioni sono molto più simili tra loro rispetto alle diverse versioni di echo
. E non c'è bisogno di ricordare le opzioni della riga di comando (con alcune eccezioni; GNU Coreutils printf accetta --version
e --help
, e il built-in bash printf accetta -v var
per memorizzare l'output in una variabile).
Per il tuo esempio:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
E ora è tempo per me di ammettere che echo
funzionerà altrettanto bene per l'esempio di cui stai chiedendo; devi solo mettere doppie virgolette attorno all'argomento:
echo "[$res]"
come ha scritto kmkaplan (due anni e mezzo fa, l'ho appena notato!). Il problema con i tuoi comandi originali:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
non è con echo
; è che la shell ha sostituito la scheda con uno spazio echo
mai visto prima.
echo
va bene per output semplice, come echo hello world
, ma dovresti usare printf
ogni volta che vuoi fare qualcosa di più complesso. È possibile ottenere echo
al lavoro, ma il codice risultante rischia di fallire quando si esegue con una diversa echo
implementazione o di una shell diversa.
Inserisci la stringa tra virgolette doppie :
echo "[$res]"
Puoi anche provare:
echo Hello$'\t'world.
allora devi usare -e flag per l'eco quindi puoi
echo -e "\t\t x"
Dalla pagina man di bash:
Le parole del modulo $ 'stringa' sono trattate in modo speciale. La parola si espande in stringa, con i caratteri con escape backslash sostituiti come specificato dallo standard ANSI C.
Quindi puoi farlo:
echo $'hello\tworld'
Utilizzare la Verbatim battitura, ^V
( CTRL+V
, C-v
, qualunque cosa ).
Quando si digita ^V
nel terminale (o nella maggior parte degli editor Unix), il seguente carattere viene preso alla lettera . Puoi usarlo per digitare un carattere di tabulazione letterale all'interno di una stringa che stai facendo eco.
Qualcosa come i seguenti lavori:
echo "^V<tab>" # CTRL+V, TAB
Documenti Bash ( qv , "quoted-insert")
quoted-insert (Cq, Cv) Aggiunge il carattere successivo che digiti alla riga alla lettera. Ecco come inserire sequenze di tasti come Cq, ad esempio.
nota a margine: secondo questo, ALT+TAB
dovrebbe fare la stessa cosa, ma tutti abbiamo legato quella sequenza al cambio di finestra, quindi non possiamo usarla
tab-insert (M-TAB) Inserisce un carattere tab.
-
Nota: puoi usare questa strategia con tutti i tipi di personaggi insoliti. Come un ritorno in carrozza:
echo "^V^M" # CTRL+V, CTRL+M
Questo perché il ritorno a capo è ASCII 13 e M è la 13a lettera dell'alfabeto, quindi quando si digita ^M
, si ottiene il 13 ° carattere ASCII. Puoi vederlo in azione usando ls^M
, a un prompt vuoto, che inserirà un ritorno a capo, facendo sì che il prompt si comporti proprio come hai premuto return. Quando questi personaggi vengono normalmente interpretati, letteralmente ottieni il carattere letterale.
grep
per catturare linee contenenti tab
personaggi.
L'uso dell'eco per stampare i valori delle variabili è una trappola comune di Bash. Link di riferimento: