我遇到了这个问题而没有找到足够的解决方案,也许你们可以帮助我。
我需要这样做:
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中的字符串路径。我在VMware ESXi上遇到的错误是:
-sh: ./this/is/a/path/some.log: Device or resource busy
我做错了什么?有人可以帮帮我吗?
答案 0 :(得分:0)
首先,不鼓励使用find
循环for
的输出,因为它不适用于包含空格或glob元字符的文件名(例如*
)。
使用-exec
开关实现您的目标。文件{}
的名称将作为$0
传递给脚本。
find -name 'vmware.log' -exec sh -c 'echo "$0" | cut -d/ -f2' {} \;
# or with bash
find -name 'vmware.log' -exec bash -c 'cut -d/ -f2 <<<"$0"' {} \;
看起来你想在文件名而不是文件的内容上使用cut,所以你需要传递名称来剪切标准输入,而不是作为参数。这可以使用管道|
或使用Bash的<<<
herestring语法来完成。
答案 1 :(得分:-2)
你应该尝试使用这样的东西:
#!/bin/bash
VAR1="$1"
VAR2="$2"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'
echo $MOREF
使用tickquotes将执行命令并将其存储在变量中。