我有以下命令行来检查文件系统的可用空间:
fs_used=`df -h /u01 | sed '1d' | sed '1d' | awk '{print $4}' | cut -d'%' -f1`
它工作正常。它返回文件系统上已用空间的百分比(不带 % 符号)。
现在我需要使它可变并使用 eval 命令运行它 .我尝试了以下但它不起作用(退出 df: invalid option -- 'd')
df_cmnd="df -h $fs1 | sed '1d' | sed '1d' | awk '{print $4}' | cut -d'%' -f1"
fs_used=eval $df_cmnd
我猜,问题在于 eval 无法运行管道命令。真的吗?
是否有任何解决方法或替代方法可以运行此代码?
最佳答案
反斜杠转义 $
,并使用 $()
:
# V V
df_cmnd="df -h \$fs1 | sed '1d' | sed '1d' | awk '{print \$4}' | cut -d'%' -f1"
fs_used=$(eval "$df_cmnd")
# ^^ ^
这将使用
fs1
的值在你评估的时候。但是,实际上,请don't use eval !改为将其设为 shell 函数:
df_cmnd(){
df -h "$1" | sed '1d' | sed '1d' | awk '{print $4}' | cut -d'%' -f1
}
fs_used=$(df_cmnd /u01)
那你就不用担心逃跑了。
解释
看看如何
bash
诠释您的 df_cmnd
任务:$ df_cmnd="df -h $fs1 | sed '1d' | sed '1d' | awk '{print $4}' | cut -d'%' -f1"
$ echo $df_cmnd
df -h | sed '1d' | sed '1d' | awk '{print }' | cut -d'%' -f1
# ^ ^
就我而言,
fs1
是空的,所以我得到了 df -h
为 df
部分。在你和我的情况下,bash 取代了 $4
它的值在这里为空,因为我没有在带有四个参数的脚本中运行。因此,awk 将打印整行而不仅仅是第四个字段。
关于bash - 使用 eval 运行管道命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47794205/