xargs :在多个命令中使用相同的参数

xargs :在多个命令中使用相同的参数

我正在尝试编写一个单行代码,可以探测其中一个分区的输出df -h并在其中一个分区[或几乎]空间不足时发出警报。正是使用 xargs 的部分现在让我很恼火......

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

我怎样才能让第二个 {} 也显示“95”?

答案1

&&不是xargs命令的一部分,它是完全独立的调用。我想你会想显式执行一个 shell:

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

另请注意,我使用_percent而不是{}避免 shell 带来额外的引用麻烦。它不是一个 shell 变量;仍然只是一个xargs替换字符串。

答案2

另一种更具可读性的方法是定义一个单独的函数,其中包含所有其他命令,然后xargs在子 shell 中调用该函数。

因此,例如:

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'

快乐的脚本!!! @恩里克

相关内容