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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:41:50