カンマ区切りリストを繰り返し、各項目に対してコマンドを実行する方法

カンマ区切りリストを繰り返し、各項目に対してコマンドを実行する方法

変数には、カンマで区切られたautosysジョブのリストを出力するコマンドがあります$all_jobs

box=box-of-jobs;all_jobs=$(jobscout -box $box | egrep "^\w+" | tr '\n' ','  | sed s/.$//); 

リストの各エントリに対して sendevent コマンドを呼び出したいと思います。

sendevent -verbose -S NYT -E JOB_OFF_HOLD -J $job --owner me

たとえば、$all_jobsjob1、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

私は繰り返しkshスクリプトを書くことができると確信していますが、通常はawk / sedを使用してこれらのコンテンツを作成する方が速いことがわかります。どちらも慣れていないので、私のスキルレベルを超えています。私はbshではなくkshを使用しています。

答え1

$var特定の文字から文字列を分割するために、シェルには非常に詳細な機能が組み込まれています。引用符なしで作成すると、次のように拡張されます。

  1. 変数の値を取得しますvar
  2. この値をフィールドリストに分割します。フィールド区切り文字は変数値の文字ですIFS。空白文字が含まれている場合、連続IFS区切り記号は空白以外の文字に対して1つとして扱われ、連続区切り記号は空のフィールドになります。
  3. ワイルドカードが実行されます。つまり、各結果フィールドはファイル名のワイルドカードパターンとして解釈されます。 1 つ以上のファイルに一致するパターンごとに一致するファイルのリストで置き換えます。

コマンドの置き換えでも同じことが起こります$(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

答え2

カンマ間のフィールドにスペースが含まれていないと確信している場合は、次のようにします。

for job in $(echo $all_jobs | tr "," " "); do
    sendevent -verbose -S NYT -E JOB_OFF_HOLD -J "$job" --owner me
done

もっと強力なものが必要な場合は、見てください。UnixでCSVファイルを処理するために必要なツール

答え3

あなたはそれを使用することができますxargs

all_jobs="job1,job2,job3"
echo $all_jobs | tr '\n' ' ' | xargs -d, --replace=xx sendevent -verbose -S NYT -E JOB_OFF_HOLD -J xx --owner me

最後に改行文字がない場合は、trパイプを介して接続する必要がない可能性があります。$all_jobs

関連情報