У меня есть этот 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
Что мне здесь не хватает?
См. принятый ответ здесь: stackoverflow.com/questions/73668255/…
Bash для циклов разделяется, когда они видят какие-либо пробелы, такие как пробел, табуляция или новая строка. Итак, вы должны использовать IFS (внутренний разделитель полей)
Если строки заканчиваются на «\n», попробуйте добавить IFS=$'\n'
перед циклом (вы можете использовать unset IFS
, чтобы сбросить его позже)
У вас тут много примеров: Как разделить строку по разделителю в Bash?
Пробел также назначается IFS по умолчанию и учитывается при разделении слов.
Здесь есть три распространенных решения: во-первых, временно установить IFS на $'\n'
, как уже предложил Atxulo. Во-вторых, использовать цикл while read
для экземпляра подстановки процесса, что полезно для больших или неопределенных входных данных. В-третьих, использовать readarray
, который сохраняет все входные данные в массив. Я считаю, что это наиболее практично для вашей проблемы.
readarray -t jobs < <(java ...)
for job in "${jobs[@]}"; do
В вашем сценарии есть и другие проблемы. Во-первых, это ненужное использование sed. Просто используйте ${param//pat/rep}
. Вы также позволяете нескольким переменным подвергаться ненужному разбиению слов. Процитируйте их.
Подробности читайте в руководстве Bash.
Как указывает тег bash, который вы использовали: «В случае сценариев оболочки с синтаксисом или другими ошибками, пожалуйста, проверьте их на shellcheck.net , прежде чем публиковать их здесь». См. также mywiki.wooledge.org/BashFAQ/001