我正在尝试编写一个单行代码,可以探测其中一个分区的输出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'
快乐的脚本!!! @恩里克