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

如何在Bourne Shell中读取并比较含换行符的字符串?

Bourne Shell 测试红黑树程序的解决方案

解决输入非法字符问题

首先排查red-black_tree提示“输入包含非法字符”的核心原因:

  • 先确认程序的输入格式要求:
    • 如果程序通过命令行参数接收数字,直接执行:./red-black_tree 1 3 2
    • 如果程序要求标准输入每行一个数字,用printf传递正确格式的输入:printf "1\n3\n2\n" | ./red-black_tree
    • 如果程序接受空格分隔的单行输入,用echo传递:echo "1 3 2" | ./red-black_tree
      多数情况下错误是因为输入格式和程序预期不匹配,比如程序要每行一个数字,你却传了空格分隔的一行内容。

处理带换行的预期输出与比较

要在Bourne Shell中正确读取和对比包含换行符的字符串,有两种可靠实现方式:

方法1:变量保存后直接比较

用here-doc定义预期输出(完整保留换行符),捕获程序实际输出后,通过双引号包裹变量完成对比:

# 定义预期输出,EOF加单引号避免Shell自动替换变量
expected=$(cat << 'EOF'
Node 1: black
Node 2: red
Node 3: black
EOF
)

# 捕获程序实际输出(根据输入格式调整命令)
actual=$(printf "1\n3\n2\n" | ./red-black_tree)

# 执行对比
if [ "$actual" = "$expected" ]; then
    echo "测试通过"
else
    echo "测试失败"
    echo "--- 实际输出 ---"
    echo "$actual"
    echo "--- 预期输出 ---"
    echo "$expected"
fi

注意:变量必须用双引号包裹,否则换行符会被Shell解析为空格,导致对比结果错误。

方法2:用diff命令对比文件(适合复杂输出)

将实际输出和预期输出写入临时文件,用diff直观展示差异:

# 创建临时文件
tmp_actual=$(mktemp)
tmp_expected=$(mktemp)

# 写入程序实际输出
printf "1\n3\n2\n" | ./red-black_tree > "$tmp_actual"

# 写入预期输出
cat << 'EOF' > "$tmp_expected"
Node 1: black
Node 2: red
Node 3: black
EOF

# 对比文件内容
if diff "$tmp_actual" "$tmp_expected" > /dev/null; then
    echo "测试通过"
else
    echo "测试失败,差异如下:"
    diff "$tmp_actual" "$tmp_expected"
fi

# 清理临时文件
rm -f "$tmp_actual" "$tmp_expected"

内容的提问来源于stack exchange,提问作者Fyodor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:34:56