在 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,您的日志记录会变得有点可疑,因为事情发生在午夜之前。这对你是否重要是你必须做出的判断。我建议明确日志文件中的日期+时间;几天后更容易诊断发生了什么。
我制作了这个脚本来检查以确保创建了离岸脚本。我工作正常 &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,您的日志记录会变得有点可疑,因为事情发生在午夜之前。这对你是否重要是你必须做出的判断。我建议明确日志文件中的日期+时间;几天后更容易诊断发生了什么。