如何在 bash 中进行 while 循环工作?
Posted
技术标签:
【中文标题】如何在 bash 中进行 while 循环工作?【英文标题】:How to make working while loop in the bash? 【发布时间】:2022-01-23 06:46:12 【问题描述】:我不是真正的程序员。只需要我自己的小脚本。
我希望每次关闭程序时都将 Home bank 的保存文件复制到 Google Drive。 复制脚本工作正常,但触发器不起作用。
我希望循环检查程序是打开还是关闭。 但它不起作用,我不明白该怎么做。
下面的触发代码。
#! /bin/bash
cycle=0
open=$(ps -eo cmd | grep homebank)
echo "$open"
while [ $cycle = 0 ]
do
if [ "$open" = 'homebank grep homebank' ]
then [ $cycle = 1 ]
echo 'homebank was opened'
fi
done
while [ $cycle = 1 ]
do
if [ "$open" = 'grep homebank' ]
then
cycle=0
bash ~/.scripts/home-bank-updater
echo 'homebank was closed'
fi
done
非常感谢您的关注和帮助。
【问题讨论】:
作为第一步,我建议将ps -eo cmd | grep homebank
替换为pgrep homebank
。
如果您正在阅读教程,我建议您阅读真正的 Bash 教程,而不是暗示 POSIX 兼容性的东西,这会给您带来不必要的惩罚。另外至少尝试阅读整个 Bash 手册一次。
【参考方案1】:
我在这里看到了一些问题。首先,open=$(ps -eo cmd | grep homebank)
将open
变量设置为该命令的输出在分配时。变量永远不会更新,因此值永远不会改变,重新测试它只会一遍又一遍地给出相同的结果。要重新检查,需要重新运行命令。
但无论如何,这是一种不好的检查方式。一方面,输出不会是homebank grep homebank
;它可能是 homebank<newline character>grep homebank
或 grep homebank<newline character>homebank
或者甚至可能是其他东西。如果可用,最好使用pgrep
,因为它旨在消除此类问题。如果不是,请使用ps -eo cmd | grep '[h]omebank'
- 方括号将阻止grep
命令匹配自身,因此您只会看到您感兴趣的进程。
而不是捕获来自pgrep
/grep
命令的输出,只需使用命令本身的退出状态(并使用-q
或>/dev/null
丢弃输出):
if pgrep homebank >/dev/null; then
或
if ps -eo cmd | grep -q '[h]omebank'; then
第二,then [ $cycle = 1 ]
没有设置cycle
的值,它测试它(并且不对结果做任何事情)。你想要then cycle=1
。除了我会完全跳过该变量,而只是使用pgrep
结果作为循环测试(并添加延迟,因此它不会尝试每微秒进行测试):
until pgrep homebank >/dev/null; do
sleep 0.5
done
echo 'homebank was opened'
我不确定我是否理解第二个循环的用途;是等到homebank
进程退出吗?如果是这样,那就是多余的,因为第一个循环已经在等待,所以我只需要在没有循环的情况下将这些步骤包含在内。
【讨论】:
谢谢,我使用了你的代码。我做了两个循环,因为我想在关闭程序时只更新一次文件。所以我等待它打开,然后等待关闭。#! /bin/bash
``until pgrep homebank >/dev/null; do
`睡眠0.5`done
echo 'homebank was opened'
``while pgrep homebank >/dev/null; do
`睡眠0.5`done
bash ~/.scripts/home-bank-updater
echo 'homebank was closed'
抱歉,五分钟内还没弄明白如何格式化 cmets。以上是关于如何在 bash 中进行 while 循环工作?的主要内容,如果未能解决你的问题,请参考以下文章