使用eval运行管道命令

Oul*_*bba 1 bash eval escaping pipe quoting

我有以下命令行来检查文件系统的可用空间:

fs_used=`df -h /u01 | sed '1d' | sed '1d' | awk '{print $4}' | cut -d'%' -f1`
Run Code Online (Sandbox Code Playgroud)

它工作正常.它返回文件系统上已用空间的百分比(不带%符号).

现在我需要使它变量并使用eval命令运行它.我尝试了以下但它不起作用(退出df:无效选项 - 'd')

df_cmnd="df -h $fs1 | sed '1d' | sed '1d' | awk '{print $4}' | cut -d'%' -f1"
fs_used=eval $df_cmnd
Run Code Online (Sandbox Code Playgroud)

我想,问题是eval无法运行管道命令.真的吗?是否有任何解决方法或替代方法来运行此代码?

cxw*_*cxw 7

反斜杠 - 逃避$,并使用$():

#              V                                         V
df_cmnd="df -h \$fs1 | sed '1d' | sed '1d' | awk '{print \$4}' | cut -d'%' -f1"
fs_used=$(eval "$df_cmnd")
#       ^^               ^
Run Code Online (Sandbox Code Playgroud)

这将使用fs1您评估时的值.

但是,实际上,请不要使用eval!改为使用shell函数:

df_cmnd(){
    df -h "$1" | sed '1d' | sed '1d' | awk '{print $4}' | cut -d'%' -f1
}
fs_used=$(df_cmnd /u01)
Run Code Online (Sandbox Code Playgroud)

那你就不用担心逃跑了.

说明

看看如何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
#    ^                                   ^
Run Code Online (Sandbox Code Playgroud)

在我的情况下,fs1是空的,所以我只是得到df -hdf部分.在你和我的情况下,bash替换$4为它的值,这里是空的,因为我没有在带有四个参数的脚本中运行.因此,awk将打印整行而不仅仅是第四个字段.