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

Я использовал USB-устройство записи образов на моем виртуализированном linux mint и на этот раз с usb 2 для записи linux mint ISO. ЭТО РАБОТАЕТ! Я могу загрузиться с живого диска на моем основном компьютере

3
20.04.2016, 23:59
2 ответа

сначала ваша функция 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
2
27.01.2020, 21:18

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

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

while IFS= read -r c
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
2
27.01.2020, 21:18

Теги

Похожие вопросы