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 
  • Startscript: использование $! создать pidfile - иногда возвращать неправильный pid (выключен одним)
  • Shell Script считывает метаданные файла, а затем mv каждый в новый каталог
  • Сценарий оболочки декодирования Url
  • Использовать сценарий ожидания из Vagrantfile для обеспечения - проблема с несуществующим файлом во время выполнения
  • Обнаруживать, если переменная пуста
  • IF для возврата true, если слово содержит конкретное письмо
  • Как избежать метасимволов оболочки с помощью команды `find`?
  • pssh (Parallel-ssh), передающий разные параметры для каждого хоста
  • Распространяемое завершение для моих сценариев bash
  • Bash: слияние имени папки из переменной с именем файла
  • Запросить пользователя для предложения и сохранить его, не нарушая пространства
  • Interesting Posts

    Сетевая проблема класса Arch Linux

    QEMU VM с использованием драйверов virtio без поддержки / модуля ядра на хосте?

    Вход из TCP-порта, разбивающего сообщения на символы, отличные от новой строки

    Я могу ssh на удаленную машину, но я не могу использовать scp для копирования локальных файлов на удаленную машину

    Невозможно изменить право собственности на папку, принадлежащую никому

    Любой способ показать каждый шаг во время обработки команды?

    setfacl весь каталог, содержащий различные типы файлов?

    Заставить локальное разрешение DNS для внешних хостов

    две сетевые карты в одной подсети и два фиктивных устройства на одном хосте – маршрутизация

    Почему мой цикл while игнорирует условие и продолжает действовать навсегда?

    Ошибка компиляции u-boot

    Как заставить samba следовать символической ссылке за пределами общего пути

    Как установить gnome-terminal для удаления имени сервера, не касаясь PS1?

    Окно GTK gtkdialog для создания ссылки

    Скопировать файлы из списка в папку

    Linux и Unix - лучшая ОС в мире.