我已经给出了一个命令,该命令输出变量中 autosys 作业的逗号分隔列表$all_jobs
:
box=box-of-jobs;all_jobs=$(jobscout -box $box | egrep "^\w+" | tr '\n' ',' | sed s/.$//);
Run Code Online (Sandbox Code Playgroud)
我想为列表中的每个项目调用一个 sendevent 命令:
sendevent -verbose -S NYT -E JOB_OFF_HOLD -J $job --owner me
Run Code Online (Sandbox Code Playgroud)
例如,如果$all_jobs
评估 job1,job2,job3
我想打电话
sendevent -verbose -S NYT -E JOB_OFF_HOLD -J job3 --owner me
sendevent -verbose -S NYT -E JOB_OFF_HOLD -J job2 --owner me
sendevent -verbose -S NYT -E JOB_OFF_HOLD -J job1 --owner me
Run Code Online (Sandbox Code Playgroud)
我确信我可以编写一个 ksh 脚本来循环执行,但是我知道使用 awk/sed 通常可以更快地编写这些东西,这两者我都不太熟悉,因此超出了我的 megre 技能。我正在使用 ksh(而不是 bsh)。
在特定字符处拆分字符串是在非常深的级别构建到 shell 中的:如果您编写时$var
没有任何引号,那么它会按如下方式展开:
var
变量的值。IFS
变量值中的任何字符。如果IFS
包含空格字符,则将连续的分隔符视为一个;对于非空白字符,连续的分隔符会导致空字段。命令替换$(somecommand)
也会发生同样的情况,除了第 1 步是“收集运行的输出somecommand
并在最后去除所有换行符”。
为了避免所有这些繁琐的事情并只获得变量的确切值,或者命令的输出减去最后的换行符,请确保将变量替换或命令替换放在双引号之间:"$foo"
, "$(foo)"
。
要将命令替换的结果拆分为逗号字符,请设置IFS=,
替换不受保护。您还需要做一件事:关闭通配符,使用set -f
(然后使用set +f
.
all_jobs=$(…)
set -f; IFS=,
for job in $all_jobs; do
sendevent -verbose -S NYT -E JOB_OFF_HOLD -J "$job" --owner me
done
set =f; unset IFS
Run Code Online (Sandbox Code Playgroud)