Dlaczego „wc -c” wypisuje jeszcze jedną wartość za pomocą echa?

13

Podczas biegania

echo abcd | wc -c

powraca 5.
Ale słowo abcdma tylko 4 znaki.

Czy echopo słowie jest drukowany jakiś znak specjalny abcd?

Czy mogę temu zapobiec echo?

użytkownik78050
źródło
1
Pamiętaj, że wc -cnie mówi ci, ile znaków jest czymś; mówi tylko, ile to bajtów.
tchrist

Odpowiedzi:

21

echowypisz newline ( \n) na końcu linii

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

W przypadku niektórych echoimplementacji możesz użyć -n:

-n nie wysyłaj końcowego znaku nowej linii

i przetestuj:

echo -n abcd | wc -c
4

W przypadku niektórych innych potrzebujesz \csekwencji ucieczki:

\c: Pomiń <newline>argument, który w przeciwnym razie następuje po ostatnim argumencie w danych wyjściowych. Wszystkie znaki następujące '\c'po argumentach zostaną zignorowane.

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

Przenośnie użyj printf:

printf %s abcd | wc -c
4

(zwróć uwagę, że wc -cliczy się bajty, a nie znaki (choć w przypadku abcdsą one generalnie równoważne). Użyj wc -mdo zliczenia znaków).

بارپابابا
źródło
Należy pamiętać, że chodzi o to, że w niektórych echoimplementacjach (wszystkie zgodne jedynek Unix co najmniej), jest to echo 'abcd\c', że wyjść abcdsama. echo -e 'abcd\c'w echoimplementacjach zgodnych z Uniksem wyświetlałby dane wyjściowe -e abcd.
Stéphane Chazelas,
5

Jeśli uruchomisz echobez -nopcji, po argumentach zapisuje znak nowej linii. W przeciwnym razie, jeśli wpiszesz echo foo, następny monit powłoki pojawi się po prawej stronie foo. Więc  wcliczy się przełamane.

Jak mogę temu zapobiec echo?

echo -n abcd | wc -c
G-Man mówi „Przywróć Monikę”
źródło
2

Domyślnie echowypisze znak nowego wiersza ( \n) po łańcuchu (dlatego w następnym wierszu zamiast wiersza polecenia, w którym abcdjest drukowany , pojawi się monit powłoki ).

Możesz spróbować dodać -nparametr, echoaby wyłączyć końcowy znak nowej linii.

echo -n abcd | wc -c
4
Chirag Bhatia - chirag64
źródło