arrays - 为什么这个拆分字符串表达式不给我一个数组?
问题描述
我想知道为什么 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
解决方案
您可以只readarray
/mapfile
而不是为将多行输出读入数组而量身定制的。
mapfile -t possibleEncodings < <(iconv -l)
当您可以在进程替换模型中运行命令时,此处的字符串是无用的。将<()
命令输出就好像它出现在mapfile
要读取的文件中一样。
至于为什么你最初的尝试没有奏效,你只是做了read
一次调用,但在后续行中仍有字符串要读取。您要么需要循环阅读直到 EOF,要么使用mapfile
上面为您完成工作的方法。
作为旁注,用户定义的变量/数组和函数名称始终使用小写字母。这使您可以将变量与 shell 自己的大写环境变量区分开来。
推荐阅读
- javascript - Javascript汉堡菜单不会保持打开状态
- node.js - 如何使用 zx 在 package.json 中运行脚本?
- javascript - 角度js多选到单下拉转换
- ios - 如何在 UIView(不是 UITableView、UICollectionView、UIScrollView)上添加 Pull-to-refresh
- rest - 如何重写 Refit 的接口方法实现?
- python - NOT NULL 约束失败:blogs_comment.blog_id
- javascript - 为什么不在我的 react 项目中添加 css 样式?
- visual-studio - 有选择地阻止或警告重命名重构
- jmeter - 我的问题是我必须只循环不成功的请求 3 次,但是当控制器也在 jmeter 中循环成功的请求时
- rust - 如何在匹配中使用表达式作为条件?