caratteri di tabulazione Echo in script bash
Domanda
Come faccio eco di uno o più caratteri di tabulazione utilizzando uno script bash? Quando ho eseguito questo codice
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
ottengo questo
res=[ x] # that is [<space>x]
Soluzione
echo -e ' \t '
risuonano 'spazio scheda spazio nuova riga' (-e
significa 'abilitazione interpretazione backslash'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
Altri suggerimenti
Usa printf
, non echo
.
Ci sono più versioni differenti del comando echo
. C'è /bin/echo
(che può o non può essere la versione GNU Coreutils, a seconda del sistema), e il comando echo
è integrato nella maggior parte delle shell. Versioni differenti hanno modi diversi (o alcun modo) per specificare o disattivare fughe per i caratteri di controllo.
printf
, d'altra parte, ha molto meno variazioni. Può esistere come un comando, tipicamente /bin/printf
, ed è costruito in alcune conchiglie (bash e zsh hanno, tcsh e ksh non lo fanno), ma le diverse versioni sono molto più simili tra loro rispetto alle diverse versioni di echo
sono. E non c'è bisogno di ricordare le opzioni della riga di comando (con alcune eccezioni; GNU Coreutils printf accetta --version
e --help
, e il printf bash incorporato 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 è il momento per me di ammettere che echo
funzionerà altrettanto bene per l'esempio che stai chiedendo circa; hai solo bisogno di mettere le virgolette attorno all'argomento:
echo "[$res]"
come kmkaplan scritto (due anni e mezzo fa, ho appena notato!). Il problema con i 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 prima echo
mai visto.
echo
va bene per l'uscita semplice, come echo hello world
, ma si dovrebbe usare printf
ogni volta che si vuole fare qualcosa di più complesso. possono get echo
a lavorare, ma il codice risultante rischia di fallire quando si esegue con un'implementazione echo
diverso o una shell diversa.
Metti la stringa tra virgolette:
echo "[$res]"
Si può anche provare:
echo Hello$'\t'world.
è necessario utilizzare la bandiera -e per eco allora si può
echo -e "\t\t x"
Dalla pagina man di bash:
Le parole della forma $ 'stringa' sono trattati in modo speciale. La parola si espande a stringa, con barre rovesciate escape sostituito come specificato dallo standard ANSI C.
Quindi, si può fare questo:
echo $'hello\tworld'
L'uso di echo per stampare i valori delle variabili è un errore comune Bash. Link di riferimento:
Con la combinazione di tasti Verbatim, ^V
(CTRL+V
, C-v
, qualsiasi ).
Quando si digita ^V
nel terminale (o in maggior parte degli editor di Unix), è tratto il seguente carattere Verbatim . È possibile utilizzare questo per digitare un carattere di tabulazione letterale all'interno di una stringa che si sta facendo eco.
Qualcosa come le seguenti opere:
echo "^V<tab>" # CTRL+V, TAB
Bash docs ( qv , "quoted-insert")
-insert indicata (C-q, C-v) Aggiungere il carattere successivo digitato alla linea di parola per parola. Questo è come inserire sequenze chiave come C-q, per esempio.
nota a margine: in base a questo, ALT+TAB
dovrebbe fare la stessa cosa, ma abbiamo tutti destinati quella sequenza di finestra per il passaggio in modo da non possiamo usarlo
scheda-insert (M-TAB) Inserire un carattere di tabulazione.
-
Nota: è possibile utilizzare questa strategia con tutti i tipi di personaggi insoliti. Come un ritorno a capo:
echo "^V^M" # CTRL+V, CTRL+M
Questo è dovuto al fatto ritorno a capo è ASCII 13, e M è il 13 ° lettera dell'alfabeto, in modo che quando si digita ^M
, si ottiene il carattere ASCII 13 °. Potete vederlo in azione con ls^M
, al prompt vuoto, che inserirà un ritorno a capo, causando la richiesta di agire proprio come si colpisce di ritorno. Quando questi caratteri sono normalmente interpretati, Verbatim ti fa ottenere il carattere letterale.
Se si desidera utilizzare echo "a\tb"
in uno script, si esegue lo script come:
# sh -e myscript.sh
In alternativa, si può dare a myscript.sh il permesso di esecuzione, e quindi eseguire lo script.
# chmod +x myscript.sh
# ./myscript.sh
res="\t\tx"
echo -e "[${res}]"