在bash脚本中循环

时间:2015-06-16 11:53:29

标签: bash shell aix

我是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 

3 个答案:

答案 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"
}