xargs:複数のコマンドで同じ引数を使用します。

xargs:複数のコマンドで同じ引数を使用します。

df -hパーティションの1つの出力を調べて、パーティションの1つにスペースが[またはほぼ]不足しているときに警告を発する可能性がある1行コードを作成しようとしています。今私を怒らせるのはxargsを使う部分です...

echo 95 | xargs -n1 -I{} [ {} -ge 95 ] && echo "No Space on disk {}% full -- remove old backups please"

2番目の{}にも「95」が表示されるようにするにはどうすればよいですか?

答え1

これはコマンドの一部&&ではなく、完全に別々の呼び出しです。xargs私の考えでは、明示的にシェルを実行したいと思います。

echo 95 | xargs -I_percent sh -c '[ "$1" -ge 95 ] && echo "No Space on disk $1% full -- remove old backups please"' sh _percent

また、シェルの追加の引用の問題を回避するために代わりに_percent使用していることに注意してください。{}これはシェル変数ではありません。それでもxargs代替文字列です。

答え2

別の読みやすいアプローチは、他のすべてのコマンドを含む別々の関数を定義し、サブシェルからそのxargs関数を呼び出すことです。

たとえば、次のようになります。

myfunc(){
  [ "$1" -ge 95 ] && echo "No Space on disk $1% full -- remove old backups please"
  echo "Another command echoing $1"
}

export -f myfunc

echo 95 | xargs -n1 -I_percent -- sh -c 'myfunc "_percent"'

答え3

ただ使えますshオプションに言及し、次のようにコマンドを一重引用符で囲みます。ifバージョン:

#Your example
echo 95 | xargs -n1 -I{} sh -c '[ {} -ge 95 ] && echo "No Space on disk {}% full -- remove old backups please"'

#if equivalent
echo 95 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; fi'

xargsそして使用ニックネーム存在する-Iより良い読みやすさのためのオプション

echo 95 | xargs -n1 -IusedSpace sh -c 'if [ usedSpace -ge 95 ]; then echo "No Space on disk usedSpace% full -- remove old backups please"; fi'

そしてもし必要な数のコマンドをセミコロンで区切ります。; 次のような2 および 4 コマンド接続の例

# 2 independent commands
echo 95 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; echo "Value processed {}"; fi'
# 4 independent commands
echo 95 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; echo "Space left on disk $( expr 100 - {})%"; echo "Space used {}%"; echo "Value processed {}"; fi'

あなたの例にケースを追加すると、else左側にディスクスペースが印刷されます。

#If with else block
echo 80 | xargs -n1 -I{} sh -c 'if [ {} -ge 95 ]; then echo "No Space on disk {}% full -- remove old backups please"; else echo "Space left on disk $( expr 100 - {})%"; fi'

#Equivalent
echo 80 | xargs -n1 -I{} sh -c '[ {} -ge 95 ] && echo "No Space on disk {}% full -- remove old backups please"; [ {} -ge 95 ] || echo "Space left on disk $( expr 100 - {})%"'

別の変更により、次のように変数から制限付き使用の95%を分離できます。

echo 96 | xargs -n1 -IusedSpace sh -c 'usageLimit=95; if [ usedSpace -ge ${usageLimit} ]; then echo "No Space on disk usedSpace% full -- remove old backups please"; else echo "Space left on disk $( expr 100 - usedSpace)%"; fi'

楽しいスクリプト! ! ! @エンリケ

関連情報