如何在Bash脚本中通过终端参数拼接多个文本文件?
解决Bash脚本拼接多个文本文件的问题
我来帮你搞定这个问题~你的脚本有几个关键问题,咱们一步步理清楚并修正:
原脚本的问题分析
while read $1用法错误:read命令是用来从标准输入读取单行内容的,不是用来遍历终端传入的命令行参数。你要处理的是启动脚本时传入的文件列表,应该用位置参数集合$@来操作。- 使用
>重定向会覆盖文件:每次执行cat $1 > cat.txt都会清空cat.txt再写入当前文件内容,最终只会保留最后一个文件的内容,应该用>>来实现追加写入。 - 没有处理带空格的文件名:直接用
$1这类变量如果遇到文件名含空格的情况会出错,必须用双引号包裹变量(比如"$file")。
方案1:简洁高效的直接拼接(推荐)
如果只是单纯把所有传入的文本文件拼接成一个文件,其实不需要循环,cat 命令本身就支持同时读取多个文件并输出,直接一行搞定:
#!/bin/bash # 把所有传入的文件内容直接写入cat.txt(会覆盖原有内容) cat "$@" > cat.txt
"$@"代表所有启动脚本时传入的命令行参数,双引号能确保带空格、特殊字符的文件名被正确识别。- 如果需要保留
cat.txt原有内容并追加新文件,把>换成>>即可。
方案2:循环拼接(适合需要额外操作的场景)
如果你需要在拼接每个文件时做额外处理(比如添加分隔线、打印文件名等),可以用 for 循环遍历参数:
#!/bin/bash # 先清空cat.txt(不需要保留旧内容时用,否则删除这行) > cat.txt # 遍历所有传入的文件参数 for file in "$@"; do # 可选:添加分隔线或文件名标识 echo "--- 分割线:来自文件 $file ---" >> cat.txt # 追加当前文件内容到cat.txt cat "$file" >> cat.txt done
原脚本的错误修正思路(仅作参考)
如果非要用 while 结构来实现(其实完全没必要,不如上面两种方案简洁),可以通过把参数列表转为标准输入来让 read 读取:
#!/bin/bash > cat.txt # 将参数列表转为逐行输入,供read读取 while IFS= read -r file; do cat "$file" >> cat.txt done < <(printf '%s\n' "$@")
内容的提问来源于stack exchange,提问作者John S.
相关产品推荐
相关产品推荐

