如何在Bash脚本中读取一行特定部分?拆分输入与预期值问题
解决方法
针对你需要拆分同一行中输入值与正确值的需求,有几种实用的Bash命令/方法可以实现:
1. 直接用read命令拆分变量(最简洁高效)
read命令默认会按空白字符(空格、制表符等)分割行内容,并依次赋值给多个变量。你可以直接在while循环中声明两个变量:
#!/bin/bash # 编译部分保持不变 cc main.c -S cc increment.c -S cc main.s -c cc increment.s -c cc main.o increment.o -o main # 修改read循环,同时读取input和correct while read input correct; do echo "input: $input, main: " # 捕获程序输出结果 result=$(./main <<< "$input") echo "$result, correct: $correct" # 对比实际结果与预期值 if [ "$result" -eq "$correct" ]; then echo "测试通过" else echo "测试失败:预期$correct,实际$result" fi done < "./tests_inputs.txt"
如果你的输入文件中用的是其他分隔符(比如逗号,),可以通过设置IFS(内部字段分隔符)来指定:
while IFS=, read -r input correct; do # 逻辑同上 done < "./tests_inputs.txt"
-r选项用于禁用反斜杠转义,避免读取特殊字符时出现异常。
2. 用cut命令拆分
如果需要更灵活的字段提取,可以用cut命令按分隔符截取字段:
while read line; do input=$(echo "$line" | cut -d' ' -f1) # -d指定分隔符,-f1取第一个字段 correct=$(echo "$line" | cut -d' ' -f2) # -f2取第二个字段 # 后续测试逻辑同上 done < "./tests_inputs.txt"
3. 用awk命令拆分
awk擅长处理文本字段,也可以用来拆分行内容:
while read line; do input=$(awk '{print $1}' <<< "$line") correct=$(awk '{print $2}' <<< "$line") # 后续测试逻辑同上 done < "./tests_inputs.txt"
其中第一种方法(直接用read多变量赋值)是最推荐的,因为它不需要额外调用外部命令,性能更好,代码也更简洁。
内容的提问来源于stack exchange,提问作者MoJ
相关产品推荐
相关产品推荐

