如何在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
相关产品推荐
相关产品推荐

