Grep 从工作目录插入文件名

Grep 从工作目录插入文件名

我有脚本可以完成一些工作:

  • 列出 config XML.
  • 列出其中哪些XML有匹配项。
  • 显示那场比赛是什么。
JENKINS_HOME=/var/lib/jenkins

_ALL_JOBS=$( find $JENKINS_HOME/jobs -name config.xml )

_CRON_JOBS=$( for _JOB in $( echo "$_ALL_JOBS" ); do grep -l 'triggers.TimerTrigger' $_JOB; done )

for _JOB in $( echo "$_CRON_JOBS" ); do
    _TIME_TRIGGER=$( grep -A 1 'hudson.triggers.TimerTrigger' $_JOB | head -2 | tail -1 )
    echo ${_JOB}: $_TIME_TRIGGER
done

$_ALL_JOBS就像是:

/var/lib/jenkins/jobs/Testing/jobs/job1/config.xml
/var/lib/jenkins/jobs/Testing/jobs/job2/config.xml
/var/lib/jenkins/jobs/Testing/jobs/job3/config.xml
/var/lib/jenkins/jobs/Testing/jobs/job4/config.xml
/var/lib/jenkins/jobs/Testing/jobs/job5/config.xml

$_CRON_JOBS是一个选择$_ALL_JOBS,看起来像:

/var/lib/jenkins/jobs/Testing/jobs/job2/config.xml
/var/lib/jenkins/jobs/Testing/jobs/job4/config.xml
/var/lib/jenkins/jobs/Testing/jobs/job5/config.xml

当我从命令行对这些文件之一运行 GREP 时,我得到类似这样的信息:<spec>H 1 * * *</spec>

当我在循环中的每个文件上运行相同的命令时,我得到了这个我当前正在工作的目录的内容:

<spec>H */6 file1 file2 file3 file4 file5*</spec>

如果我更改为不同的工作目录并运行脚本,我会得到相同的结果,但 XML 标记之间出现的文件是新工作目录的文件:

<spec>H */6 file6 file7 file8 file9 file10*</spec>

循环或匹配内容是否存在导致我当前工作目录的内容夹在匹配中的内容?

感谢您的任何想法。

答案1

试试这个例子:

$ mkdir -p test_dir && cd test_dir/
$ touch file1 file2
$ time_trigger='<spec>H 1 * * *</spec>'

$ echo "$time_trigger"
<spec>H 1 * * *</spec>

$ echo $time_trigger
<spec>H 1 file1 file2 file1 file2 *</spec>

您的输出是未加引号的变量的结果,一些星号扩展到当前目录的文件。

即使修复此问题后,其余代码在某些情况下也可能会失败,例如文件名中包含空格,并且您不应该使用echo打印变量并将此输出再次分配给变量,它很容易受到攻击。


您的脚本的可能版本可能是:

find "$JENKINS_HOME"/jobs -name 'config.xml' -exec sh -c '
    for f do
        <apply your logic for every config file "$f">
    done' sh {} +

看到这个邮政以供参考。

相关内容