Unix и Windows имеют разные форматы окончания строки. В мире Unix строки заканчиваются символом перевода строки (LF, ascii char 10). В Windows строки заканчиваются символом возврата каретки (CR, ascii char 13), за которым следует перевод строки.
Файлы с окончаниями строк Windows должны быть преобразованы в формат Unix, прежде чем они смогут работать с инструментами Unix. В противном случае такие программы, как bc
, рассматривают символы CR как нежелательные и жалуются, как в вашем случае.
Чтобы преобразовать файлы в формат Unix, вы можете использовать dos2unix(1)
, если он установлен, или поочередно пропустить его через sed 's/^M//g'
(но не вводите литерал ^ M - нажмите Ctrl + V, а затем Ctrl + M).
Так почему ^M
? Ну, возврат каретки - это непечатаемый символ . У него нет печатного представления. Для удобства ваш терминал отобразит его как ^M
*. Так почему же он не появился, когда вы сделали echo $values
? К сожалению, обработка аргументов командной строки удаляет его, поэтому вы его не видите.
Также для вашего удобства ваш терминал позволяет печатать непечатаемых символов с помощью Ctrl + V и Ctrl + некоторые буквы. Ctrl + V и Ctrl + M создадут символ ^M
, но переместите курсор влево и вправо, и вы увидите, что он пропускает все это как один символ - не , как при вводе ^
с последующим M
. В то время как you видит ^M
, программы командной строки видят только необработанные данные и будут видеть реальный символ возврата каретки.
Почему 5E 4d 0a, то есть ^ M, 13-й символ в ASCII?
Вы запустили hexdump
на выходе echo "^M"
, который производит три символа: ^
, M
и символ перевода строки (LF). Смотрите выше, это не то же самое, что возврат каретки!
Почему знак окончания 0a отображается как.? , это 2E в DEC. Шестнадцатеричное число 5E равно 94 в DEC, 4d равно 77 в DEC.
Hexdump отображает все непечатаемые символы в виде .
символов, включая символы возврата каретки и перевода строки.
* Почему именно М? Соглашение состоит в том, чтобы добавить 64 к коду ASCII. Возврат каретки - код 13 ASCII (0x0D). Добавьте 64, и вы получите 77 (0x4D) в верхнем регистре M. См. эту страницу для полного списка.