我有一个简单的问题要问你,但我自己无法回答。我下面有一个变量,在打印结果后显示空白。
脚本:
core_out=find coretst.*
echo "$core_out"
Result: No display *blank*
#tried to echo without double quotes as well but it has the same result
顺便说一句,我正在使用腻子。
实际目标: 1. 检查 /opt/datintdv/Informatica/9.6.1/server/bin --dir1 中的 core.* - 如果 core.* 存在且大于 1,则获取 1 core.* 然后执行 strings (core.* )| grep “pmdtm(“ --script1 如果 script1 不起作用,则将输出存储在参数中 执行文件(核心文件名) 直到全部核心。已执行,然后将输出存储在变量中。 - 如果 dir1 上不存在 core.*,则检查 /opt/datintdv/Informatica/9.6.1/tomcat/bin 如果 core.* 存在且大于 1,则获取 1 core.*,然后执行 strings (core.*) | grep “pmdtm(“ --script1 如果 script1 不起作用,则将输出存储在参数中 执行文件(核心文件名) 直到全部核心。已执行,然后将输出存储在变量中。 *输出由换行符分隔
- 获取所有输出,然后将其连接为电子邮件正文。
- 通过电子邮件将其发送给用户。 *我目前正在为此编写脚本,但我遇到了困难,因为这是我第一次这样做。
希望你能帮助我!谢谢!
答案1
命令替换,这意味着使用命令的结果进行内联操作,是通过$( ... )
.
就你而言,
core_out=$( find coretst.* )
但是,这将提示find
查找以以下内容开头的所有路径coretst.*
扩展至的任何内容开头的所有路径。我假设您想要做的是在当前目录或下面查找文件与模式相匹配coretst.*
。你会这样做
core_out=$( find . -type f -name 'coretst.*' )
引用该coretst.*
模式会阻止 shell 将其扩展为当前目录中的名称。
然后,问题是您想如何处理由此返回的路径名。如果您只想打印它们,则根本不需要变量:
find . -type f -name 'coretst.*'
如果你愿意消除这些文件,那么您应该从以下位置执行此操作find
:
find . -type f -name 'coretst.*' -exec rm {} +
对文件的任何其他操作也可以从内部执行find
。
参见问题“为什么循环查找的输出是不好的做法?” 为什么使用find
返回的路径可能是一个坏习惯(答案是关于循环 的结果find
,我想这就是您稍后可能想要做的事情)。
来自评论:
我想在当前文件夹中搜索它,并且其输出将用于子字符串,因此将用于此:
strings ($core_out) | grep "pmdtm("
如果我理解正确的话,这可以通过
find . -type f -name 'coretst.*' -exec strings {} + | grep -F 'pmdtm('
即,运行strings
所有找到的文件并查找包含字符串 的行pmdtm(
。
如果您想知道在哪个文件中找到匹配项:
find . -type f -name 'coretst.*' -exec sh -c '
for name; do
if strings "$name" | grep -qF "pmdtm("; then
printf "%s\n" "$name"
fi
done' find-sh {} +