我想知道为什么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
答案 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)"