Perché "wc -c" stampa un valore di un altro con echo?


13

Durante la corsa

echo abcd | wc -c

ritorna 5.
Ma la parola abcdè lunga solo 4 caratteri.

La echostampa ha qualche carattere speciale dopo la parola abcd?

E posso impedire echodi stamparlo?



1
Si prega di essere consapevoli del fatto che wc -cnon ti dice quanti personaggi c'è qualcosa; indica solo quanti byte è.
tchrist,

Risposte:


21

echostampa newline ( \n) alla fine della riga

echo abcd | xxd
0000000: 6162 6364 0a          abcd.

Con alcune echoimplementazioni, puoi utilizzare -n:

-n non genera la nuova riga finale

e prova:

echo -n abcd | wc -c
4

Con alcuni altri, è necessaria la \csequenza di escape:

\c: Sopprimere <newline>ciò che altrimenti segue l'argomento finale nell'output. Tutti i caratteri che seguono gli '\c'argomenti devono essere ignorati.

echo -e 'abcd\c' | wc -c
4

Portabilmente, usare printf:

printf %s abcd | wc -c
4

(nota che wc -cconta i byte, non i caratteri (sebbene nel caso abcdsiano generalmente equivalenti). Usa wc -mper contare i caratteri).


Si noti che il punto è che con alcune echoimplementazioni (almeno tutte conformi a Unix), sono solo gli echo 'abcd\c'output abcd. echo -e 'abcd\c'nelle echoimplementazioni conformi a Unix sarebbe uscita -e abcd.
Stéphane Chazelas,

5

Se si esegue echosenza l' -nopzione, scrive un carattere di nuova riga dopo gli argomenti. Altrimenti, se hai digitato echo foo, il tuo prossimo prompt della shell apparirà alla destra del foo. Quindi  wcconta la nuova riga.

Come posso evitare echodi stamparlo?

echo -n abcd | wc -c

2

Per impostazione predefinita, echostamperà un carattere di nuova riga ( \n) dopo la stringa (motivo per cui viene visualizzato il prompt della shell sulla riga successiva anziché sulla stessa riga in cui abcdè stampato.)

Puoi provare ad aggiungere un -nparametro echoper disabilitare il carattere di nuova riga finale.

echo -n abcd | wc -c
4
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.