我是bash的新手,但我需要创建一个简单的脚本,它将执行以下步骤:
等一分钟
A)bash脚本将使用CM生成结果文件
B)检查结果文件中的第8行(以了解管理员是否正在运行任何作业)
如果没有工作:
C)bash脚本将使用CM启动多维数据集刷新
D)等1分钟
D1)删除结果文件
E)生成结果文件
E1)阅读第8行
没有工作: F)删除结果文件G)退出
是:
I)转到D)
YES:
E)等待1分钟
F)删除结果文件
转到A)
由于bash没有转到(或者不应该使用),我尝试了几个循环,但我不确定应该选择哪个。
我知道如何: - 启动立方体(步骤C) - 生成结果文件(步骤A和E): - 检查第8行: sed' 8!d' /abc_uat/cmlogs/adm_jobs_u1.log 循环的条件可能与此类似:!='所有者=管理员'
但如何避免转到?
我尝试使用while循环,但我不确定在错误情况下我应该添加什么,我添加了其他内容,但不确定:
sleep 60
Generate result file with admin jobs (which admin runs inside of 3rd party tool)
while [ sed '8!d' admin_jobs_result_file.log !="Owner = Administrator" ];
do
--NO Admin jobs
START CUBE REFRESH (it will start admin job)
sleep 60
REMOVE RESULT FILE (OLD)
GENERATE RESULT FILE
while [ sed '8!d' admin_jobs_result_file.log = "Owner = Administrator" ];
--Admin is still running cube refresh
do
sleep 60
REMOVE RESULT FILE (OLD)
GENERATE RESULT FILE
-- it should continue checking every 1 minute if admin is still running cube refresh job, so I hope it will go back to while condition
else
done
else
-- Admin is running something
sleep 60
REMOVE RESULT FILE (OLD)
GENERATE RESULT FILE
-it should check result file again but I think it will finish loop
done
答案 0 :(得分:0)
您可以用循环替换goto。例如,循环。
<强>语法强>
while <condition>
do
action
done
答案 1 :(得分:0)
结帐cron jobs。如果可能的话,代表&#34;等待一分钟&#34;任务到cron。 Cron应该担心及时运行你的脚本。
您可以考虑编写两个脚本而不是一个脚本。
您真的需要创建结果文件吗?你知道piping吗? (没有冒犯,只是提到它,因为你说你对bash相当新)
答案 2 :(得分:0)
希望这是自我解释的。
result_file=admin_jobs_result_file.log
function generate {
logmsg sleeping
sleep 60
rm -f "$result_file"
logmsg generating
# use CM to generate result file
}
function owner_is_administrator {
# if line 8 contains "Owner = Administrator", exit success
# else exit failure
sed -n '8 {/Owner = Administrator/ q 0; q 1}' "$result_file"
}
function logmsg { date "+%Y-%m-%d %T -- $*"; }
##############
generate
while owner_is_administrator; do
generate
done
# at this point, line 8 does NOT contain "Owner = Administrator"
logmsg start cube refresh
# use CM to start cube refresh
generate
while owner_is_administrator; do
generate
done
logmsg Done
看起来AIX的sed无法以指定状态退出。试试这个:
function owner_is_administrator {
# if line 8 contains "Owner = Administrator", exit success
# else exit failure
awk 'NR == 8 {if (/Owner = Administrator/) {exit 0} else {exit 1}}' "$result_file"
}