Shell脚本对比C程序输出失败:unexpected operator错误求助
解决Shell脚本中字符串比较的错误问题
我来帮你搞定这个测试脚本的问题,你遇到的报错和测试不通过主要是两个细节没处理好:
1. POSIX Shell不支持==比较运算符
你脚本开头用的是#!/bin/sh,这是遵循POSIX标准的Shell,它的test命令(也就是[ ]语法)里,字符串相等比较只能用=,而==是bash等扩展Shell才支持的语法。这就是你看到unexpected operator错误的直接原因。
2. 变量展开时的空格丢失问题
你写的echo $OUTPUT没有用双引号包裹,Shell会自动把输出里的连续空格、制表符等合并成单个空格,导致实际输出的格式和程序原始输出不一致——就算内容完全正确,也可能因为格式被破坏而匹配失败。必须用echo "$OUTPUT"才能保留原始的空格格式。
修正后的脚本
把这两个问题修复后,脚本就能正常工作了:
#!/bin/sh OUTPUT="$(./q1_sequence 5 1 3 2 1)" echo "$OUTPUT" # 双引号包裹,保留原始输出格式 EXPECTED="5 1 3 2 1 : returns a value of 99 and 15 iterations" if [ "$OUTPUT" = "$EXPECTED" ] # 用POSIX标准的=替代== then echo "Test was true" else echo "Test was not true" fi
额外建议:用diff做更可靠的对比
如果你的C程序输出包含换行、特殊字符等,直接字符串比较容易踩坑,用diff工具对比会更稳妥,还能直观看到差异:
#!/bin/sh OUTPUT="$(./q1_sequence 5 1 3 2 1)" EXPECTED="5 1 3 2 1 : returns a value of 99 and 15 iterations" # 通过diff静默对比,无差异则返回0(成功) if printf "%s\n" "$OUTPUT" | diff -q <(printf "%s\n" "$EXPECTED") - >/dev/null then echo "Test was true" else echo "Test was not true" echo "--- Actual output ---" echo "$OUTPUT" echo "--- Expected output ---" echo "$EXPECTED" fi
内容的提问来源于stack exchange,提问作者user9416023
相关产品推荐
相关产品推荐

