ord
Ваша функция действительно странно. Может быть, было бы лучше, чтобы написать:
function ord {
printf -v ordr "%d" "'$1"
}
Тогда вы будете использовать его как:
TEXT=$(cat "$1")
for ((i=0; i<${#TEXT}; i++)); do
ord "${TEXT:$i:1}"
printf '%s\n' "$ordr"
done
Это все еще оставляет две проблемы: вы не будете в состоянии иметь нулевые байты, и вы выиграли Не вижу конца новых строк. Например (я назвал свой сценарий banana
и chmod +x banana
):
$ ./banana <(printf 'a\0b\n')
97
98
Две проблемы показывают здесь: нулевые байты удаляются из Bash в TEXT=$(cat "$1")
частях, так как переменная Bash не может содержать нулевые байты. Более того, этот шаг также обрезает завершающие символы новой строки.
Более надежный подход будет использовать read
:
while IFS= read -r -n 1 -d '' char; do
ord "$char"
printf '%s\n' "$ordr"
done < "$1"
С этой модификации:
$ ./banana <(printf 'a\0b\n')
97
0
98
10
Обратите внимание, что этот сценарий будет зависеть от вашей местности. С моей местности (LANG="en_US.UTF-8
):
$ ./banana <(printf 'a\0ℂ\n')
97
0
8450
10
тогда:
$ LANG= ./banana <(printf 'a\0ℂ\n')
97
0
226
132
130
10
Это, чтобы показать вам, что Bash не читает байт, но символы. Поэтому в зависимости от того, как вы хотите, чтобы Bash обрабатывал ваши данные, установите соответственно LANG
.
Если ваш скрипт только делает это, это гораздо проще не использовать ord
функцию на все:
#!/bin/bash
while IFS= read -r -n 1 -d '' char; do
printf '%d\n' "'$char"
done < "$1"
Это так просто!
Покажите свои функции 'ord' и' chr' и как вы их используете с вашим файлом! –
@lurker Так я считаю, что проблема это в том, как хранить содержимое файла я делаю STR = 'кошки file1' В новых строках значения впитывается, как вы сказали .. Как я могу хранить в контенте вар файл – JhonaBona99
Вы ошибаетесь: 'STR = $ (cat file1)' _doesn't "поглощать" (что бы это ни значило) значения новой строки_. Вероятно, вам не хватает котировок, что, к сожалению, слишком распространенная ошибка. Покажите свой код! –