Bash: 变量包含可执行路径 -> 转换为字符串

Bash: Variable contains executable path -> Convert to string

我遇到了这个问题,还没有找到足够的解决方案,也许你们可以帮助我。

我需要这样做:

find -name some.log

回头率会很高。所以现在我想用这样的 "for" 来完成它:

    for a in $(find -name vmware.log)
    do
      XXXXXXX
    done

之后,我想切断变量$a中的路径。假设 $a 具有以下内容:

./this/is/a/path/some.log

我将用

来削减这个变量
cut -d/ -f2 $a

完成后的代码是这样的:

for a in $(find -name vmware.log)
do
  cutpath=cut -d/ -f2 $a
done

当我这样做时,bash 使用 $a 的内容作为系统路径而不是字符串。所以 "cut" 尝试直接访问该文件,但它应该只剪切 $a.The 中的字符串路径 我在 VMware ESXi 上得到的错误是:

-sh: ./this/is/a/path/some.log: Device or resource busy

我做错了什么?有人可以帮我吗?

你应该尝试使用这样的东西:

#!/bin/bash

VAR1=""
VAR2=""

MOREF='sudo run command against $VAR1 | grep name | cut -c7-'

echo $MOREF

使用tickquotes 将执行命令并将其存储在变量中。

首先,不鼓励使用 for 循环遍历 find 的输出,因为它不适用于包含空格或 glob 元字符(例如 *)的文件名。

这实现了你想要的,使用 -exec 开关。文件名 {} 作为 [=16=].

传递给脚本
find -name 'vmware.log' -exec sh -c 'echo "[=10=]" | cut -d/ -f2' {} \;
# or with bash
find -name 'vmware.log' -exec bash -c 'cut -d/ -f2 <<<"[=10=]"' {} \;

您似乎想对文件名而不是文件内容使用 cut,因此您需要在标准输入上传递要剪切的名称,而不是作为参数。这可以使用管道 | 或使用 Bash 的 <<< herestring 语法来完成。