如何在 bash 中进行 while 循环?

How to make working while loop in the bash?

我不是真正的程序员。只需要我自己的小脚本。

我希望每次关闭程序时都将家庭银行的保存文件复制到 google 驱动器。 复制脚本工作正常,但触发器不工作。

我想要循环检查程序是打开还是关闭。 但它不起作用,我不明白该怎么做。

下面的触发代码。

#! /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

非常感谢您的关注和帮助。

我在这里看到了一些问题。首先,open=$(ps -eo cmd | grep homebank)open 变量设置为该命令的输出 在它被赋值时 。该变量永远不会更新,因此该值永远不会改变,重新测试它只会一遍又一遍地给出相同的结果。要重新检查,您需要重新运行 命令。

但这无论如何都是一种糟糕的检查方式。一方面,输出不会是 homebank grep homebank;它可能是 homebank<newline character>grep homebankgrep 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进程退出?如果是这样,那是多余的,因为第一个循环已经在等待它,所以我只包含那些没有循环的内联步骤。