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]
È stato utile?

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:

http://mywiki.wooledge.org/BashPitfalls#echo_.24foo

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}]"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top