bash читает новую строку, printf сообщает символ 0

Я использую функцию bash printf для печати кодов символов ASCII во входном файле, но по какой-то причине printf выводит код ascii 0 для символов LF , а не 10. Какие-нибудь идеи почему?

 while IFS= read -r -n1 c do ch=$(LC_CTYPE=C printf "%d\n" "'$c") # convert to integer echo "ch=$ch" done < input_file_name 

Честно говоря, я даже не уверен, что это проблема с printf или это функция read , которая поставляет неправильное значение LF … Существуют ли другие способы преобразования символов в ASCII с помощью команд bash?

2 Solutions collect form web for “bash читает новую строку, printf сообщает символ 0”

сначала ваша функция printf отлично работает

 $ export c=" " $ LC_CTYPE=C printf "%d\n" "'$c" 32 

Но запуск строки сценария с -vx показывает, что данные, попадающие на эту строку, неверны (я не буду вставлять этот вывод)

Поэтому я считаю, что это неправильно. По умолчанию разделитель EOL для чтения является новой строкой, поэтому я попытался изменить это. Это похоже на работу

 while IFS= read -d\0 -r -n1 c; do ch=$(LC_CTYPE=C printf "%d\n" "'$c") ; echo "ch=$ch"; done < input_file_name 

read не является неправильным, но вы неправильно интерпретируете результаты.

Маркер EOL равен \n , поэтому ввод этого символа означает, что read столкнулось с «линией», в которой нет символов. Заметим, что переменная $c не содержит \n :

 while IFS= read -rc do test -z "$c" && echo "Zero length string" || echo "I read '$c'" done 

Добавляя -n1 вы ограничиваете количество символов, которые можно читать только одному. Как и в приведенном выше примере, \n не является частью принятой строки, поэтому read возвращает «ничего» при вводе \n :

 while IFS= read -r -n1 c do test -z "$c" && echo "Zero length string" || echo "I read '$c'" done 

Команда printf интересна. Если вы кормите его строкой нулевой длины с одиночной кавычкой, вы также получите «0», поэтому я подозреваю, что ответ здесь «не делай этого»:

 LC_CTYPE=C printf "%d" "'" | od -c 0000000 0 
  • Делайте работу «читать», когда не фокусируетесь на терминале
  • Подстановочный знак Bash для соответствия точно n символам
  • wget-файл, протоколирование вывода и отображение вывода в командной строке
  • Пока петля застряла в бесконечном цикле
  • Почему функция не возвращается, пока фоновый процесс не завершится?
  • Вывод в переменной не должен интерпретироваться как команда
  • Идентификация повторяющихся полей и УДАЛЕНИЕ обоих с awk
  • Условное выполнение - запуск постоянных подпроцессов и коротинов
  • Использование подстановки команд
  • Как я могу заставить переменные среды «экспортироваться» в скрипт оболочки?
  • Как я могу игнорировать «zip warning: name not match» при использовании команды zip с опцией -d?
  • Linux и Unix - лучшая ОС в мире.