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 语法来完成。
我遇到了这个问题,还没有找到足够的解决方案,也许你们可以帮助我。
我需要这样做:
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 语法来完成。