如何在 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 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
进程退出?如果是这样,那是多余的,因为第一个循环已经在等待它,所以我只包含那些没有循环的内联步骤。
我不是真正的程序员。只需要我自己的小脚本。
我希望每次关闭程序时都将家庭银行的保存文件复制到 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 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
进程退出?如果是这样,那是多余的,因为第一个循环已经在等待它,所以我只包含那些没有循环的内联步骤。