【问题标题】:Why doesn't this split string expression give me an array?为什么这个拆分字符串表达式不给我一个数组?
【发布时间】:2018-11-06 23:22:15
【问题描述】:

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

【问题讨论】:

  • IFS='\n' 表示字段由反斜杠或“n”分隔,而不是换行符。你可以改用IFS=$'\n'

标签: arrays string bash split


【解决方案1】:

因为read只读取一行,所以可以使用后面的while

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

否则还有readarray内置

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

【讨论】:

  • 关于信息:strace 给我的 readarray 执行时间(秒)为 0.000119,mapfile 为 0.000145,循环为 0.000154
【解决方案2】:

您可以只使用readarray/mapfile 而不是专门为将多行输出读取到数组中而设计的。

mapfile -t possibleEncodings < <(iconv -l)

here-strings 是无用的,当您可以在进程替换模型中运行命令时。 &lt;() 将命令输出放在文件中,就好像它出现在文件中一样,供mapfile 读取。

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

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

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多