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

如何在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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:31