Как iconv и od справляются с порядком байтов?

Массив bashне может быть переменной среды, так как переменные среды могут быть только парами ключевых строк -значений.

Вы можете сделать то, что делает оболочка со своей переменной $PATH, которая по существу является массивом путей; превратить массив в строку, разделенную определенным символом, иначе не присутствующим в значениях массива:

$ arr=( aa bb cc "some string" )
$ arr=$( printf '%s:' "${arr[@]}" )
$ printf '%s\n' "$arr"
aa:bb:cc:some string:

Или аккуратнее,

arr=( aa bb cc "some string" )
arr=$( IFS=:; printf '%s' "${arr[*]}" )
export arr

Расширением ${arr[*]}будут элементы массива arr, разделенные первым символом IFS, здесь установлено значение :. Обратите внимание, что если сделать это таким образом, элементы строки будут разделены (, а не разделены)на :, что означает, что вы не сможете отличить пустой элемент в конец, если он был.


Очевидно, что альтернативой передаче значений сценарию с использованием переменных окружения является (? )для использования аргументов командной строки:

arr=( aa bb cc )

./some_script "${arr[@]}"

Затем сценарий будет обращаться к переданным аргументам либо один за другим, используя позиционные параметры $1, $2, $3и т. д., либо с помощью$@:

printf 'First I got "%s"\n' "$1"
printf 'Then  I got "%s"\n' "$2"
printf 'Lastly there was "%s"\n' "$3"

for opt in "$@"; do
    printf 'I have "%s"\n' "$opt"
done
0
21.07.2020, 18:04
1 ответ

odвроде ничего не меняет, а iconvменяет. Согласно вашему выводу, эта система отображает utf-16в utf-16be. Сравните с выводом моего Ubuntu на x86 -64:

$ echo hello | iconv -f ascii -t utf-16le | hd
00000000  68 00 65 00 6c 00 6c 00  6f 00 0a 00              |h.e.l.l.o...|
0000000c
$ echo hello | iconv -f ascii -t utf-16le | od -x
0000000 0068 0065 006c 006c 006f 000a
0000014
$ echo hello | iconv -f ascii -t utf-16be | hd
00000000  00 68 00 65 00 6c 00 6c  00 6f 00 0a              |.h.e.l.l.o..|
0000000c
$ echo hello | iconv -f ascii -t utf-16be | od -x
0000000 6800 6500 6c00 6c00 6f00 0a00
0000014

Можно было бы вызвать od -t x1вместо hdс аналогичным результатом:

$ echo hello | iconv -f ascii -t utf-16be | od -t x1
0000000 00 68 00 65 00 6c 00 6c 00 6f 00 0a
0000014

похоже на hd, но без столбца ASCII.

Но мой Ubuntu сопоставляет utf -16 с utf -16le со спецификацией:

$ echo hello | iconv -f ascii -t utf-16 | od -x
0000000 feff 0068 0065 006c 006c 006f 000a
0000016
$ echo hello | iconv -f ascii -t utf-16 | hd
00000000  ff fe 68 00 65 00 6c 00  6c 00 6f 00 0a 00        |..h.e.l.l.o...|
0000000e

Интересно, почему ваша система OS X настроена наоборот. Я не вижу для этого реальной причины; возможно, это какое-то странное наследие или ошибка конфигурации компиляции. Есть ли на него документация с упоминанием этого момента?

2
18.03.2021, 23:18

Теги

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