変数には、カンマで区切られた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_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
私は繰り返しkshスクリプトを書くことができると確信していますが、通常はawk / sedを使用してこれらのコンテンツを作成する方が速いことがわかります。どちらも慣れていないので、私のスキルレベルを超えています。私はbshではなくkshを使用しています。
答え1
$var
特定の文字から文字列を分割するために、シェルには非常に詳細な機能が組み込まれています。引用符なしで作成すると、次のように拡張されます。
- 変数の値を取得します
var
。 - この値をフィールドリストに分割します。フィールド区切り文字は変数値の文字です
IFS
。空白文字が含まれている場合、連続IFS
区切り記号は空白以外の文字に対して1つとして扱われ、連続区切り記号は空のフィールドになります。 - ワイルドカードが実行されます。つまり、各結果フィールドはファイル名のワイルドカードパターンとして解釈されます。 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