为什么这个拆分字符串表达式不能给我一个数组?

时间:2018-05-28 11:15:05

标签: arrays string bash split

我想知道为什么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 :(得分:2)

您可以readarray / mapfile来定制,以便将多行输出读入数组。

mapfile -t possibleEncodings < <(iconv -l)

当您可以在流程替换模型中运行命令时,here-strings是无用的。 <()将命令输出放置在mapfile的文件上,以便进行读取。

至于为什么您的原始尝试无法正常工作,您只需执行一次read调用,但在后续行中仍有字符串要读取。您需要在循环中读取EOF或使用上面的mapfile为您完成工作。

作为旁注,总是使用小写字母表示用户定义的变量/数组和函数名称。这使您可以将变量与shell自身的环境变量区分开来。

答案 1 :(得分:1)

因为read只能读取一行,所以可以使用

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

否则,还有readarray内置

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