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 в файлы, зависящие от переменных
  • Как я могу автоматически вводить пароль из .bash_profile при запуске команды в качестве sudo?
  • Как подождать, пока все порожденные и фоновые процессы закончатся в сценарии bash
  • Разделить многопараметрированную оболочку на несколько переменных
  • Как обнаружить архитектуру chroot внутри chroot?
  • Отображать интеграл в научной нотации?
  • Поверните изображение, если ширина больше значения (то есть в пикселях)
  • Сценарий оболочки Bash для поиска и удаления подстроки в имени файла
  • bash - определяющие переменные с VAR = $ {: - по умолчанию}
  • Убейте запущенный сценарий оболочки и убейте весь процесс, запущенный внутри него
  • как я могу найти файлы на основе разных имен и удалять их все в одной строке
  • Linux и Unix - лучшая ОС в мире.