我有脚本可以完成一些工作:
- 列出 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 {} +
看到这个邮政以供参考。