jenkins 如何从列表中删除字符串中的空格?

wrrgggsh  于 2023-02-03  发布在  Jenkins
关注(0)|答案(2)|浏览(254)

我有一个bash脚本,它列出了jenkins上的所有作业。我的作业中有空格,也有没有空格。

#!/bin/bash
for job in $(java -jar jenkins-cli.jar -s $JENKINS_URL -auth admin:admin list-jobs)
do
    file_name="$(echo "$job" | sed 's/ /-/g').xml"
    echo $file_name
    java -jar jenkins-cli.jar -s $JENKINS_URL get-job $job > $file_name
done

我的工作名称如下:

  • 新工作
  • 试验作业

但是,当我运行此脚本时,我得到了以下结果:

new.xml
job.xml
test-job.xml

相反,我希望输出:

new-job.xml
test-job.xml

我错过了什么?

nzk0hqpo

nzk0hqpo1#

Bash for循环在看到空格、制表符或换行符等空格时进行拆分。因此,应该使用IFS(内部字段分隔符)
如果行以“\n”结尾,请尝试在循环前添加IFS=$'\n'(您可以稍后使用unset IFS重置它)
这里有很多例子:如何在Bash中使用分隔符拆分字符串?

icnyk63a

icnyk63a2#

默认情况下,空格也会分配给IFS,并在单词拆分过程中使用。
这里有三种常见的解决方案:第一种方法是临时将IFS设置为$'\n',正如Atxulo已经建议的那样;第二种方法是对进程替换示例使用while read循环,这对于大的或不确定的输入很有用;第三种方法是使用readarray,它将所有输入存储到一个数组中。我相信这一种方法对您的问题最实用。

readarray -t jobs < <(java ...)

for job in "${jobs[@]}"; do

您的脚本还有其他问题。首先是不必要地使用sed。使用${param//pat/rep}即可。您还允许多个变量进行不必要的单词拆分。请引用它们。
有关详细信息,请阅读Bash手册。

相关问题