首页 > 解决方案 > Bash - 使用从文件中读取的条件来中断循环

问题描述

我正在使用 bash 运行一些命令,直到它们达到我设定的目标。

这是我的代码和解释:

#!/bin/bash

#keep running some commands until a target is met
while : 
do
  #some executions that generate a number and write into flag.txt 

  #read the number from flag.txt and store in variable flag
  while read flag
  do
    echo $flag
  done <<< $(cat flag.txt)

  echo "hello $flag"

  #if the number from the file is >= the target I set (i.e. 0.717), then break the loop and finish the computation, otherwize, keep running.
  if [ $(echo "$flag >= 0.717" | bc) -eq 1 ]
  then
    break
  fi

done

我遇到了一些错误:

0.7172
hello 
(standard_in) 1: syntax error
./test.sh: line 14: [: -eq: unary operator expected

我认为这是因为第二个 while 循环在子 shell 中运行,$flag 的值保留在第二个 while 循环中。

  do
    echo $flag
  done <<< $(cat flag.txt)

  echo "hello $flag"

为了证明这一点,如果我将 $flag 的值更改为实数:

if [ $(echo "0.72 >= 0.717" | bc) -eq 1 ]

然后我可以得到正确的结果:显然,第二个 while 循环之外的 $flag 的值只是“空白”:

0.7172
hello 

我想知道有没有办法解决这个问题?

标签: linuxbash

解决方案


根据您的评论,听起来您只需要替换:

  while read flag
  do
    echo $flag
  done <<< $(cat flag.txt)
  echo "hello $flag"
  if [ $(echo "$flag >= 0.717" | bc) -eq 1 ]; then
    break
  fi

和:

read flag < flag.txt
echo "hello $flag"
if test "$(echo "$flag >= 0.717" | bc)" -eq 1; then
    break
fi

使用 while 循环读取文件中的每一行最终都会flag设置为空字符串,因为循环不会终止,直到read到达文件末尾并设置flag为空字符串。请注意,假设echo "hello $flag"纯粹用于调试,您可以简单地执行以下操作:

if awk '{ exit ! ($1 >= .717)}' flag.txt; then break; fi

推荐阅读