如何遍历逗号分隔的列表并为每个条目执行命令

Ian*_*Ian 4 scripting ksh csv

我已经给出了一个命令,该命令输出变量中 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)。

Gil*_*il' 6

在特定字符处拆分字符串是在非常深的级别构建到 shell 中的:如果您编写时$var没有任何引号,那么它会按如下方式展开:

  1. var变量的值。
  2. 将此值拆分为字段列表。字段分隔符是IFS变量值中的任何字符。如果IFS包含空格字符,则将连续的分隔符视为一个;对于非空白字符,连续的分隔符会导致空字段。
  3. 执行通配符,即将每个结果字段解释为文件名通配符模式。对于匹配一个或多个文件的每个模式,将其替换为匹配文件列表。

命令替换$(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)