如何在Bash脚本中向已有CSV文件下一个空行追加内容不覆盖原有数据
Bash向CSV追加内容不覆盖的解决方案
正常情况下你代码里用到的>>是Shell的追加重定向符,本身不会覆盖原有文件内容,出现覆盖/内容拼接问题通常是两个原因:
- if判断为真的分支里存在
> ${name}.csv这类覆写文件的操作,>重定向符默认会先清空目标文件再写入内容 - 现有CSV文件末尾没有换行符,新追加的内容会直接拼接在原有最后一行的末尾,不是真的覆盖,但显示效果会异常
修正后的完整代码
#!/bin/bash echo "Enter file name" read name # 预检查:CSV存在且末尾无换行时先补换行,避免新内容和旧最后一行拼接 if [ -f "${name}.csv" ]; then if [ "$(tail -c 1 "${name}.csv" | wc -l)" -eq 0 ]; then echo "" >> "${name}.csv" fi fi if [ condition ] then # 注意:此分支如果要写入同一个CSV,不要用>,必须用>> # commands else echo "Enter alphabets" read alpha echo "Enter number" read number echo "1,$alpha,$number" >> "${name}.csv" fi
关键修改说明
- 所有变量引用增加双引号包裹,避免文件名包含空格等特殊字符时执行报错
- 新增文件末尾换行检测逻辑:读取文件最后1个字符,如果不是换行符,先追加空行再写入新内容,保证新内容始终在独立的新行
- if分支如果需要操作同一个CSV文件,禁止使用
>重定向符,统一用>>实现追加写入
内容的提问来源于stack exchange,提问作者Helium
相关产品推荐
相关产品推荐

