#!/bin/bash
check=`monStatus.sh -p appName:Tomcat |head -2 |tail -1 | nawk '{print $2}'`
if [ "$check" != "offline" ]; then
#echo "Tomcat still running"
sleep 90
else
#echo "Restarting Tomcat"
RestartTomcat.sh
fi
这是 shell 代码片段。我的问题是这样的。我需要第一个 then 像sleep 90
AND 一样,然后再次运行 if/then/else 语句,直到它在 else 上完成,然后一旦 Tomcat 没有显示正在运行,它就会重新启动。我无法理解如何循环它。
答案1
如果你需要不断重复脚本,你可以使用嵌套 while
环形:
while true; do
# Do something, for example output the current date and time:
printf '%(%c)T\r' -1
done
在您的示例代码中,您使用的是旧样式的子 shell 输出包装。@ThomasWard说:“大多数 Bash 指南不建议使用反引号,而是建议将命令包装在内
$( )
,即$(monStatus.sh -p appName:Tomcat | head -2 | tail -1 | nawk '{print $2}')
。这实际上是现在将子 shell 输出捕获作为变量或替换的更推荐的方法。”作为@甜点说,“请注意,反引号和语法之间实际上是有区别的
$(…)
:当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着$
、`
或。——比较和\
的输出!”echo $(echo \\ )
echo `echo \\ `
此外,您还可以简化一些事情:
使用
nawk 'FNR==2{print $2}'
而不是head -2 | tail -1 | nawk '{print $2}'
。使用 Bash 内置测试
[
(参见man test
和这回答“and” 列表运算符&&
,以及正(==
,-eq
)条件而不是负(!=
,-ne
)条件。#!/bin/bash while true; do sleep 90 [[ $(monStatus.sh -p appName:Tomcat | nawk 'FNR==2{print $2}') == 'offline' ]] && RestartTomcat.sh done
但根据评论“运行重新启动后它应该结束”,正确的建议是使用while
条件:
#!/bin/bash
while [[ $(monStatus.sh -p appName:Tomcat | nawk 'FNR==2{print $2}') -ne offline ]]
do
sleep 90
done
RestartTomcat.sh
或者如果您想使用肯定条件,则until
可以按照相同的方式实现循环:
#!/bin/bash
until [[ $(...) -eq offline ]]; do sleep 90; done; RestartTomcat.sh