Почему «wc -c» выводит значение еще одного с помощью echo?


13

При беге

echo abcd | wc -c

это возвращается 5.
Но слово abcdдлиной всего 4 символа.

Является ли echoпечать каким-то специальным символом после слова abcd?

И я могу предотвратить echoпечать этого?



1
Пожалуйста, имейте в виду, что wc -cэто не говорит вам, сколько символов что-то; это только говорит, сколько байтов это.
tchrist

Ответы:


21

echoнапечатать перевод строки ( \n) в конце строки

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

С некоторыми echoреализациями вы можете использовать -n:

-n не выводить завершающий перевод строки

и проверить:

echo -n abcd | wc -c
4

С некоторыми другими вам нужна \cescape-последовательность:

\c: Подавить, <newline>что в противном случае следует за последним аргументом в выводе. Все символы, следующие за '\c'аргументами, должны игнорироваться.

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

Портативно, используйте printf:

printf %s abcd | wc -c
4

(обратите внимание, что wc -cподсчитывает байты, а не символы (хотя в случае abcdони обычно эквивалентны). Используется wc -mдля подсчета символов).


Обратите внимание, что суть в том, что в некоторых echoреализациях (по крайней мере, во всех Unix-совместимых) echo 'abcd\c'выходы abcdодни. echo -e 'abcd\c'в Unix-совместимых echoреализациях будет выводиться -e abcd.
Стефан Шазелас

5

Если вы запускаете echoбез -nопции, после аргументов записывается символ новой строки. В противном случае, если вы наберете текст echo foo, ваше следующее приглашение оболочки появится справа от foo. Так  wcчто рассчитывает перевод строки.

Как я могу предотвратить echoпечать этого?

echo -n abcd | wc -c

2

По умолчанию echoпечатает символ новой строки ( \n) после строки (именно поэтому вы видите приглашение оболочки на следующей строке вместо той же строки, где abcdпечатается.)

Вы можете попробовать добавить -nпараметр, echoчтобы отключить завершающий символ новой строки.

echo -n abcd | wc -c
4
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.