bash - 我的 shell 脚本“break”语句不起作用
问题描述
我想打破我的嵌套 while 循环。
下面是我在我的代码中尝试过的,
while [itretative condition]
do
...
...
cat test1.json | while read line
do
...
...
cat test2.json | while read line
do
...
...
if [ "$taskstatus" = "RUNNING" ]
#when my task status reach running, i want to stop the script execution and end it.
break 3 #break 3 or exit is not working for me.
fi
done
done
done
请建议我如何实现这一目标?
解决方案
每当您使用管道时,都会创建一个子外壳。Neiterbreak
也不会exit
在子壳边界上工作。
Eventrap
不适用于子外壳边界。但是该选项set -E
告诉 Bash 继承父 shell 的错误处理程序。通过这种方式,您可以保留一个特殊的退出代码来实现break
逻辑。
以下代码分为外壳和子外壳,它们使用管道运行您的代码并创建更多子外壳。
子shell不继承外壳的错误处理程序,因为默认情况下禁用了陷阱处理程序继承。外壳的错误处理程序只检查保留的退出代码(示例中的 42)并将其视为无错误。
在第一个子 shell 中,错误处理程序继承由set -E
. 这意味着所有子 shell 共享相同的错误处理程序。子 shell 错误处理程序只是传递错误代码并终止 shell。这样所有的子shell都被终止了。
#! /bin/bash
err()
{
local err=$?
if (( err == 42 )); then
exit
else
exit $err
fi
}
trap err ERR
(
set -E
err()
{
local err=$?
exit $err
}
trap err ERR
printf "%s\n" a b c | while read i; do
echo $i
printf "%s\n" x y z | while read j; do
echo $j
exit 42
done
done
)
推荐阅读
- jquery - 使用 jQuery 在同一个站点上打开一个窗口
- javascript - 如何强制浏览器加载新内容
- php - 将大型数据集拆分为较小的部分以供 Web 查看
- formula - Netsuite 保存的搜索公式,可对日期范围内的不同值求和
- php - 需要帮助将类别、顺序和分页分配给新的 php 代码
- elasticsearch - Grok奇怪的问题
- multithreading - 每个数据库都有专用处理器的 MSMQ 架构
- node.js - 如何对扩展抽象类读取环境变量的类进行单元测试
- python - 'float' 对象在 python 中不能解释为整数
- apache-flink - 如何在 Flink 中配置检查点删除?