在 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
我显然没有办法测试这个,但它至少应该建议一些重构这个的方法。
我尝试了所有方法,但仍然无法根据以下条件停止 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
我显然没有办法测试这个,但它至少应该建议一些重构这个的方法。