linux - 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
我想知道有没有办法解决这个问题?
解决方案
根据您的评论,听起来您只需要替换:
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
推荐阅读
- python - 在python3中进行JSON序列化后进程内存未释放
- python - python中的自引用列表?
- rust - 为什么 MutexGuard 在结构中需要生命周期参数,但在函数返回类型中不需要?
- javascript - 如何使用脚本打开网站并单击按钮或执行其他操作?
- git - Git commit:禁用打开编辑器
- python - 让 python 进度条在 cygwin 中正常运行
- android - 错误:mingw32-make: *** 没有使目标“安装”的规则。停止
- couchbase - 我可以加入/分组未嵌套的对象吗?
- java - 为什么由 maven 打包的 jar 没有来自依赖项的库
- c++ - 提升野兽 websocket 连接关闭处理程序