在 while 循环中调用 Bash 函数

Calling a Bash function in a while loop

我制作了这个脚本来检查以确保创建了离岸脚本。我工作正常 &emdash;我加入了一个函数让它更干净一点。但我认为该功能不起作用,因为它会在几秒钟内同时打印出来。

#!/bin/bash
#set -x
check_offshore ()
{
    local RESULTS
    RESULTS=$(ssh -q -T casper@mybox "ls -ltr  /come/and/play/with/us/danny/DropBox| grep foreverr_and_$today.csv")
    rc=$?
}

today=$(/bin/date +%Y%m%d)
time=$(/bin/date +"%T.%3N")
iterate=0
while [ $iterate -le 5 ]
do
     check_offshore
     if [[ $rc != 0 ]] ; then
        echo "$time foreverr_and_$today.csv is not present in casper@mybox:/come/and/play/with/us/danny/DropBox"
        fi
     sleep 5
     iterate=$((iterate+1 ))
     done

这是它创建的日志 &emdash;日志时间永远不会改变。它永远保持不变,直到脚本停止。

17:42:28.380 foreverr_and_20150102.csv is not present in casper@mybox:/come/and/play/with/us/danny/DropBox
17:42:28.380 foreverr_and_20150102.csv is not present in casper@mybox:/come/and/play/with/us/danny/DropBox
17:42:28.380 foreverr_and_20150102.csv is not present in casper@mybox:/come/and/play/with/us/danny/DropBox
17:42:28.380 foreverr_and_20150102.csv is not present in casper@mybox:/come/and/play/with/us/danny/DropBox
17:42:28.380 foreverr_and_20150102.csv is not present in casper@mybox:/come/and/play/with/us/danny/DropBox
17:42:28.380 foreverr_and_20150102.csv is not present in casper@mybox:/come/and/play/with/us/danny/DropBox

发生了什么事,我该如何解决?

请注意,该问题与函数本身无关;问题出在循环及其周围环境中。

既然你没有在循环中设置 time=$(...),你希望它如何改变?

修改循环,以便在每次迭代时重新计算时间。如果您在 23:59:30 之后 运行 此脚本,日期可能会发生变化,因此您可能还想在每次迭代时设置日期。您还可以使用 Bash 特定的循环控制机制:

for ((iterate = 0; iterate <= 5; iterate++))
do
    today=$(/bin/date +%Y%m%d)
    time=$(/bin/date +"%T.%3N")
    check_offshore
    if [[ $rc != 0 ]] ; then
       echo "$time foreverr_and_$today.csv is not present in casper@mybox:/come/and/play/with/us/danny/DropBox"
    fi
    sleep 5
done

您可能更愿意坚持使用原始日期,在这种情况下,您可以在循环外继续设置 today。请注意,如果事情从 23:59:56.234 变为 00:00:02.197,您的日志记录会变得有点可疑,因为事情发生在午夜之前。这对你是否重要是你必须做出的判断。我建议明确日志文件中的日期+时间;几天后更容易诊断发生了什么。