Почему это выражение с разделенной строкой не дает мне массив? - PullRequest
0 голосов
/ 28 мая 2018

Мне интересно, почему это выражение массива в Bash не дает мне массив.Это просто дает мне первый элемент в строке:

IFS='\n' read -r -a POSSIBLE_ENCODINGS <<< $(iconv -l)

Я хочу опробовать все доступные кодировки, чтобы увидеть, как работает чтение различных кодировок файлов для скрипта в R, и я использую этот Bash-скриптдля создания текстовых файлов со всеми возможными кодировками:

#!/bin/bash

IFS='\n' read -r -a POSSIBLE_ENCODINGS <<< $(iconv -l)
echo "${POSSIBLE_ENCODINGS[@]}"

for CURRENT_ENCODING in "${POSSIBLE_ENCODINGS[@]}"
do
        TRIMMED=$(echo $CURRENT_ENCODING | sed 's:/*$::')
        iconv --verbose --from-code=UTF-8 --to-code="$TRIMMED" --output=encoded-${TRIMMED}.txt first_file.txt
        echo "Current encoding: ${TRIMMED}"
        echo "Output file:encoded-${TRIMMED}.txt"
done

РЕДАКТИРОВАТЬ: Код редактируется в соответствии с ответами ниже:

#!/bin/bash

readarray -t possibleEncodings <<< "$(iconv -l)"
echo "${possibleEncodings[@]}"

for currentEncoding in "${possibleEncodings[@]}"
do
        trimmedEncoding=$(echo $currentEncoding | sed 's:/*$::')
        echo "Trimmed encoding: ${trimmedEncoding}"
        iconv --verbose --from-code=UTF-8 --to-code="$trimmedEncoding" --output=encoded-${trimmedEncoding}.txt first_file.txt
        echo "Current encoding: ${trimmedEncoding}"
        echo "Output file:encoded-${trimmedEncoding}.txt"
done

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вместо этого вы можете просто readarray / mapfile, которые специально созданы для чтения многострочного вывода в массив.

mapfile -t possibleEncodings < <(iconv -l)

Здесь строки бесполезны, когда вы можете просто запуститькоманда в модели замещения процесса.<() выводит вывод команды так, как будто он появляется в файле для mapfile для чтения.

Что касается , почему ваша первоначальная попытка не сработала, вы просто делаетеread вызывается один раз, но есть строки для чтения в последующих строках.Вам нужно либо читать до EOF в цикле, либо использовать mapfile, как указано выше, который сделает эту работу за вас.

В качестве примечания всегда используйте строчные буквы для пользовательских переменных / массивов и имен функций.Это позволяет вам отличать ваши переменные от собственных переменных среды оболочки, которые в верхнем регистре.

0 голосов
/ 28 мая 2018

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

arr=()
while read -r line; do
    arr+=( "$line" )
done <<< "$(iconv -l)"

, в противном случае также есть readarray встроенный

readarray -t arr <<< "$(iconv -l)"
...