如何在Bash循环中对下一个元素应用if条件判断
需求实现:Bash循环中根据下一行ID执行操作
文件内容
file.txt中的内容如下:
<table class="s-table"> <thead> <tr> <th></th> <th></th> <th></th> </tr> </thead> <tbody> <tr> <td>A</td> <td>1</td> <td>5</td> </tr> <tr> <td>A</td> <td>2</td> <td>2</td> </tr> <tr> <td>B</td> <td>3</td> <td>7</td> </tr> <tr> <td>C</td> <td>4</td> <td>4</td> </tr> </tbody> </table>
需求说明
以第一列作为行ID,需要在Bash循环中实现:对每一行执行operation1和operation2;当下一行的ID与当前行ID不同时(比如第2行ID是A,第3行是B),对当前行执行operation3。
用户提供的示例代码框架如下:
while read id element1 element2; do operation1 on $id operation2 on $id if [ $id != $id + 1 ] # where + 1 means "the next line" then operation3 on $id fi done < path/file.txt
解决方案
要实现这个逻辑,关键是提前读取下一行内容并缓存,才能和当前行ID做对比。可以用以下代码实现:
#!/bin/bash # 先读取第一行作为初始当前行 read -r current_id current_e1 current_e2 < path/file.txt # 循环读取后续行作为下一行 while read -r next_id next_e1 next_e2; do # 执行当前行的operation1和operation2 operation1 "$current_id" operation2 "$current_id" # 判断下一行ID是否与当前行不同 if [ "$current_id" != "$next_id" ]; then operation3 "$current_id" fi # 将下一行内容赋值给当前行,进入下一次循环 current_id="$next_id" current_e1="$next_e1" current_e2="$next_e2" done < path/file.txt # 处理最后一行:无后续行,直接执行所有操作 operation1 "$current_id" operation2 "$current_id" operation3 "$current_id"
代码说明
- 先读取第一行缓存为当前行,再进入循环读取后续行作为下一行
- 每次循环先处理当前行的
operation1和operation2,再对比当前行与下一行的ID,不同则执行operation3 - 循环结束后单独处理最后一行:因为最后一行没有下一行,需直接执行所有操作(包括
operation3)
注意:需将代码中的operation1、operation2、operation3替换为实际命令逻辑,同时确保path/file.txt是正确的文件路径。
内容的提问来源于stack exchange,提问作者Giordano
相关产品推荐
相关产品推荐

