如何循环执行Bash命令直到两个程序输出文件的diff结果非空?
正确的循环实现方案
错误原因分析
你之前的写法while [diff normalOp.txt bruteOp.txt]存在两个关键问题:
[是test命令的别名,它和后续命令之间必须用空格分隔,否则shell会把[diff当成一个非法模式,触发zsh的"bad pattern"报错- 直接将
diff放入[]的写法逻辑错误,[]用于判断表达式,而我们需要基于diff的退出状态码来控制循环:diff输出相同时返回0,不同时返回非0
完整实现脚本
以下是符合需求的循环脚本,会持续执行流程直到两个程序输出存在差异:
#!/bin/bash # 若使用zsh,将开头改为#!/usr/bin/zsh while true; do # 1. 生成输入文件 ./programGenerator > input.txt # 2. 运行normalProgram并保存输出(用输入重定向替代cat管道,更高效) ./normalProgram < input.txt > op1.txt # 3. 运行bruteProgram并保存输出 ./bruteProgram < input.txt > op2.txt # 4. 对比输出,发现差异则终止循环并打印信息 diff op1.txt op2.txt if [ $? -ne 0 ]; then echo "=== 发现输出差异 ===" echo "输入内容:" cat input.txt echo -e "\nnormalProgram输出:" cat op1.txt echo -e "\nbruteProgram输出:" cat op2.txt break fi # 可选:打印循环进度,避免无反馈 echo "输出一致,继续生成下一组输入..." done
简化版写法
利用while循环的特性(命令返回0时继续执行),可以把整个流程整合到循环条件中:
#!/bin/bash # 循环执行流程,直到diff发现差异 while ./programGenerator > input.txt && \ ./normalProgram < input.txt > op1.txt && \ ./bruteProgram < input.txt > op2.txt && \ diff -q op1.txt op2.txt > /dev/null; do echo "输出一致,继续循环..." done # 循环终止后打印差异信息 echo "=== 发现输出差异 ===" echo "输入内容:" cat input.txt echo -e "\nnormalProgram输出:" cat op1.txt echo -e "\nbruteProgram输出:" cat op2.txt
简化版说明
diff -q仅判断是否存在差异,不输出具体内容;> /dev/null用于静默执行,避免冗余输出- 只有所有命令都返回0(输入生成成功、程序运行正常、输出一致),循环才会继续;任意步骤失败或输出不同时,循环终止
额外优化建议
- 可以添加循环次数计数器,避免无限循环(比如超过1000次自动退出)
- 若不需要保留输入输出文件,可使用临时文件(如
mktemp)减少磁盘占用
内容的提问来源于stack exchange,提问作者Mooncrater
相关产品推荐
相关产品推荐

