如何在 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 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 进程退出吗?如果是这样,那就是多余的,因为第一个循环已经在等待,所以我只需要在没有循环的情况下将这些步骤包含在内。

【讨论】:

谢谢,我使用了你的代码。我做了两个循环,因为我想在关闭程序时只更新一次文件。所以我等待它打开,然后等待关闭。 #! /bin/bash``until pgrep homebank >/dev/null; do`睡眠0.5`doneecho 'homebank was opened'``while pgrep homebank >/dev/null; do`睡眠0.5`donebash ~/.scripts/home-bank-updaterecho 'homebank was closed' 抱歉,五分钟内还没弄明白如何格式化 cmets。

以上是关于如何在 bash 中进行 while 循环工作?的主要内容,如果未能解决你的问题,请参考以下文章

ssh在bash中打破while循环[重复]

如何使用定时全局变量影响 bash while 循环?

如何在循环结束后将输入传送到 Bash while 循环并保留变量

While 循环在 Bash 的第一行之后停止读取

比较 Bash while 循环中的小数

Bash shell在while循环后“清除”一个变量,如何获取变量内文件夹中的所有文件? [复制]