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
相关产品推荐
相关产品推荐

