bash - 使用 eval 运行管道命令

标签 bash escaping pipe eval quoting

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

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 -hdf部分。在你和我的情况下,bash 取代了 $4它的值在这里为空,因为我没有在带有四个参数的脚本中运行。因此,awk 将打印整行而不仅仅是第四个字段。

关于bash - 使用 eval 运行管道命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47794205/

相关文章:

bash - 如何使用 awk 解析 Amazon S3 日志?

javascript - 如何一次转义 jquery 的 append()、onclick()、alert() 中的单引号或双引号?

ruby - 如何在命令行上获取 ruby​​ -e 的管道输入?

angular - 使用现有过滤器以 Angular 过滤多列

python - 将列表传递给 subprocess.run

bash - 可变长度的 Sed 替换

iphone - 无法在 iPhone 应用程序中加载带有空格或主题标签的 NSURL

regex - Django 。 PostgreSQL。 regexp_split_to_table 不工作

c - LINUX:在不离开当前文件夹的情况下列出外部文件夹或子文件夹的内容

linux - 读取 `stdout` 和 `stderr` 的值