首页 > 解决方案 > 为什么这个拆分字符串表达式不给我一个数组?

问题描述

我想知道为什么 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

标签: arraysstringbashsplit

解决方案


您可以只readarray/mapfile而不是为将多行输出读入数组而量身定制的。

mapfile -t possibleEncodings < <(iconv -l)

当您可以在进程替换模型中运行命令时,此处的字符串是无用的。将<()命令输出就好像它出现在mapfile要读取的文件中一样。

至于为什么你最初的尝试没有奏效,你只是做了read一次调用,但在后续行中仍有字符串要读取。您要么需要循环阅读直到 EOF,要么使用mapfile上面为您完成工作的方法。

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


推荐阅读