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'
楽しいスクリプト! ! ! @エンリケ