如何用Shell脚本读取文件并写入另一文件(含空文件处理)
问题解决
原脚本的核心问题是:当file1.txt为空时,$(cat file1.txt)没有输出内容,for循环直接跳过所有分支逻辑,因此无法触发写入"Passed"的操作。
解决方案1:读取完整内容到变量后判断
#!/bin/bash # 读取file1.txt的全部内容(含换行符)到变量 content=$(cat file1.txt) # 判断变量是否非空 if [ -n "$content" ]; then echo "$content" > file2.txt else echo "Passed" > file2.txt fi
说明
- 用
$(cat file1.txt)将文件内容完整读入变量content,保留原格式(包括多行内容) [ -n "$content" ]检查变量是否包含非空内容:- 若
file1.txt有有效内容,直接将变量内容写入file2.txt - 若
file1.txt为空,变量content为空,则写入"Passed"
- 若
解决方案2:直接检查文件是否为空(按文件大小判断)
如果你的场景中,file1.txt的"空"指文件大小为0(不含任何字符,包括空白行),可以用文件属性判断,效率更高:
#!/bin/bash if [ -s file1.txt ]; then # 文件非空,直接复制内容 cat file1.txt > file2.txt else # 文件为空,写入Passed echo "Passed" > file2.txt fi
说明
-s选项用于判断文件是否存在且大小大于0- 这种方式无需读取文件内容,适合大文件场景,但如果文件只有空白行(大小不为0但无有效内容),会被判定为非空
验证效果
- 当
file1.txt内容为258.2222时,file2.txt会得到完全相同的内容 - 当
file1.txt为空时,file2.txt会写入Passed
内容的提问来源于stack exchange,提问作者Zero5
相关产品推荐
相关产品推荐

