在 bash 脚本文件中终止具有多个条件的 while 循环

Terminate a while loop with multiple conditions in a bash script file

我尝试了所有方法,但仍然无法根据以下条件停止 while 循环:

#!/bin/sh
clear
counter=1

breakCond=$(tail -n 1 /home/a/Desktop/Triple_Graphs/11_nodes/Res/Com_Output.txt|sed -r 's/^([^.]+).*$//; s/^[^0-9]*([0-9]+).*$//')
    
cd /home/a/Desktop/cliquer-1.21
rm /home/a/Desktop/Triple_Graphs/11_nodes/Res/Com_Output.txt
clear

Mu=$(head -1 /home/a/Desktop/Triple_Graphs/11_nodes/Mu.txt)
while [[ $counter -le 97 && $breakCond -ne $Mu ]]
do
#echo $counter| tee -a outErr.txt

    ./cl -u /home/a/Desktop/Triple_Graphs/11_nodes/G_$counter.txt &> /home/a/Desktop/Triple_Graphs/11_nodes/Res/calculated_$counter.txt
#echo -e "calculated_$counter.txt \n"

    output=$(tail -1 /home/a/Desktop/Triple_Graphs/11_nodes/Res/calculated_$counter.txt)

    echo $output>>/home/a/Desktop/Triple_Graphs/11_nodes/Res/Com_Output.txt

    ((counter++))

    breakCond=$(tail -n 1 /home/a/Desktop/Triple_Graphs/11_nodes/Res/Com_Output.txt|sed -r 's/^([^.]+).*$//; s/^[^0-9]*([0-9]+).*$//')
done

我的 while 循环中的第二个条件不起作用。我正在从 txt 文件(“breakCond”和“Mu”)中读取两个值并尝试比较它们。

如果要使用Bash功能,需要确保脚本由Bash执行。 Bash 的精确位置可能会有所不同,因此我将在这里使用 env 以方便携带;但可能,您可能想要硬编码,例如#!/bin/bash 避免这种间接。

Bash 具有 built-in 循环指定次数的功能。

作为一般设计,我会删除 hard-coded 绝对路径,并可能允许用户覆盖 built-in 默认值。我还删除了显然完全多余的 cd 和 user-hostile clear。当前的重新设计只是假定您 运行 正在 /home/a/Desktop/Triple_Graphs/11_nodes 中,这样您就可以 运行 在不同的目录中使用示例数据来测试它。

#!/usr/bin/env bash

break_maybe () {
    # sed $!d replaces tail -n 1
    sed -r '$!d;s/^([^.]+).*$//; s/^[^0-9]*([0-9]+).*$//' ""
}

rm -f Res/Com_Output.txt

Mu=$(head -1 Mu.txt)

# {1..97} is Bash-specific
for counter in {1..97}; do
    if [[ $(break_maybe Res/Com_Output.txt) == "$Mu" ]]; then
        break
    fi
    /home/a/Desktop/cliquer-1.21/cl -u "G_$counter.txt" > "Res/calculated_$counter.txt" 2>&1
    tail -n 1 "Res/calculated_$counter.txt"
done >>Res/Com_Output.txt

我显然没有办法测试这个,但它至少应该建议一些重构这个的方法。