Как передать строки с символами новой строки из функции в массив? - PullRequest
0 голосов
/ 22 апреля 2020

Использование Bash Я извлекаю несколько строк из двоичного файла. Эти строки являются именами файлов, поэтому только NUL и sla sh могут не отображаться. Я использую функцию, которая выводит эти имена файлов в массив. Я знаю, я могу использовать разделитель IFS newline, чтобы получить имена файлов с пробелами. Я надеюсь, что есть возможность разделить функции многострочными строками с помощью NUL для сохранения в массиве, поэтому можно использовать любое допустимое имя файла * nix. Если я установлю IFS на '' или '\ 0', я получу несколько номеров вместо имен. Не знаю почему, и, может быть, я наблюдал за чем-то довольно простым c :) Как мне добиться получения всех возможных строк имени файла, включая не только пробелы, но и новые строки и другие символы / байтовые значения?

Вот мой упрощенный пример.

#! /bin/bash
binaryFile=$1

getBinaryList () {
    fileNameAddresses=( 123 456 789 )           #Just a mock example for simplicity
    for currAddr in "${fileNameAddresses[@]}"
    do
        fileNameStart=$((currAddr))             #Just a mock example for simplicity
        fileNameLength=48                       #Just a mock example for simplicity
        currFileName=$( dd status=none bs=1 skip=$fileNameStart count=$fileNameLength if=$binaryFile )
    printf "%s\n" "$currFileName"
    done
}

IFS=$'\n'
allFileNames=($(getBinaryList $binaryFile))

echo ${#allFileNames[@]}
printf "%s\n" "${allFileNames[@]}"

1 Ответ

2 голосов
/ 22 апреля 2020

Ваша идея верна, но с помощью нескольких небольших модификаций вы можете достичь того, что ищете. В функции getBinaryList() вместо использования printf() выдачи выходных данных с форматированием новой строки используйте разделитель байтов NULL, т. Е.

printf "%s\0" "$currFileName"

, и теперь вместо изменения IFS для перевода строки и преобразования результата в массив. Используйте команду типа mapfile, которая помещает результаты непосредственно в массив. Команда предоставляет возможность разделить результаты в байте NULL с -d '' и сохранить в массиве, указанном -t. Таким образом, ваш результат может выглядеть как

mapfile -t -d '' allFileNames < <(getBinaryList "$binaryFile")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...