我有一个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
我错过了什么?
2条答案
按热度按时间nzk0hqpo1#
Bash for循环在看到空格、制表符或换行符等空格时进行拆分。因此,应该使用IFS(内部字段分隔符)
如果行以“\n”结尾,请尝试在循环前添加
IFS=$'\n'
(您可以稍后使用unset IFS
重置它)这里有很多例子:如何在Bash中使用分隔符拆分字符串?
icnyk63a2#
默认情况下,空格也会分配给IFS,并在单词拆分过程中使用。
这里有三种常见的解决方案:第一种方法是临时将IFS设置为
$'\n'
,正如Atxulo已经建议的那样;第二种方法是对进程替换示例使用while read
循环,这对于大的或不确定的输入很有用;第三种方法是使用readarray
,它将所有输入存储到一个数组中。我相信这一种方法对您的问题最实用。您的脚本还有其他问题。首先是不必要地使用sed。使用
${param//pat/rep}
即可。您还允许多个变量进行不必要的单词拆分。请引用它们。有关详细信息,请阅读Bash手册。