You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash读取文件到数组时如何去除双引号的转义

问题描述

我的文件file.txt内容如下:

1:"z:\raws\data\fractal\todo_1.*"
2:"z:\raws\data\fractal\todo_2.*"
3:"z:\raws\data\fractal\todo_3.*"
...

我用下面的命令把内容读取到数组:

args=($(cat file.txt))

之后执行可执行文件时:

./path/to/executable ${args[@]}

实际执行时命令变成了:

./path/to/executable 1:\"z:\raws\data\fractal\todo_1.*\" 2:\"z:\raws\data\fractal\todo_2.*\"

想去掉多余的转义符\",让命令变成:

./path/to/executable 1:"z:\raws\data\fractal\todo_1.*" 2:"z:\raws\data\fractal\todo_2.*"
解决方案

原来的数组赋值方式会触发shell的分词和转义处理,导致出现多余的转义符。可以用以下几种正确的方式读取文件内容到数组:

方法1:逐行读取到数组

用read命令逐行读取,避免分词问题:

args=()
while IFS= read -r line; do
    args+=("$line")
done < file.txt

之后执行命令:

./path/to/executable "${args[@]}"

这里的IFS=保证读取整行(包括开头/结尾的空格),-r参数禁止read解析转义符,确保引号和路径里的\被正确保留。

方法2:用mapfile(bash 4.0+)

如果你的bash版本在4.0及以上,可以用更简洁的mapfile命令直接读取整个文件到数组:

mapfile -t args < file.txt

-t参数会去掉每行末尾的换行符,之后同样用"${args[@]}"传递参数:

./path/to/executable "${args[@]}"

关键注意点

  • 传递数组参数时必须用双引号包裹"${args[@]}",否则shell会再次对数组元素进行分词和转义处理。
  • 不要用args=($(cat file.txt))这种方式,它会把每行的内容按空格拆分,同时错误处理转义字符,导致参数变形。

内容的提问来源于stack exchange,提问作者Snake Eyes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:02:28