#bash #variables #jenkins #input #command-substitution
#bash #переменные #дженкинс #ввод #команда-подстановка
Вопрос:
У меня есть скрипт bash, написанный следующим образом в блоке оболочки выполнения Дженкинса
id="233"
Я хочу использовать эту переменную id внутри следующей команды
bash -c 'comm -12 <(sort file1_${id}.txt) <(sort file2_${id}.txt)'
Но это выдает ошибку
sort: cannot read: file1_.txt: No such file or directory
sort: cannot read: file2_.txt: No such file or directory
Я пробовал следовать, но безуспешно и не уверен, как исправить
"$id"
"${id}"
'$id'
'${id}'
Ответ №1:
Одинарные кавычки не позволяют $id
быть развернутыми перед bash
запуском, а переменная id
не определена в командной строке, где затем $id
выполняется попытка расширения.
Простое (но хрупкое) решение заключается в использовании двойных кавычек, так что $id
расширяется, чтобы создать команду для запуска в новой оболочке.
bash -c "comm -12 <(sort file1_${id}.txt) <(sort file2_${id}.txt)"
Более надежным решением является передача значения $id
в качестве аргумента командной оболочке (и использование двойных кавычек в команде для защиты расширения $1
, если этого требует значение $id
).
bash -c 'comm -12 <(sort "file1_$1.txt") <(sort "file2_$1.txt")' bash "$id"
(Первый аргумент, следующий за сценарием, используется для установки $0
; его значение не имеет большого значения, но имя оболочки является хорошим фиктивным аргументом.)
(Я предполагаю, что bash -c '...'
это требуется по какой-то причине, и вы не можете просто использовать comm -12 <(sort "file1_$id.txt") <(sort "$file2_$id.txt")
само по себе.)
Ответ №2:
bash -c 'comm -12 <(sort file1_'$id'.txt) <(sort file2_'$id'.txt)'
Приведенная выше строка теперь работает
Комментарии:
1. Это хрупко, если значение
$id
создает несколько слов из-за разделения слов или расширения имени пути.2. @chepner Да. но $id всегда будет заменен только одним значением. Итак, я думаю, что это подходит для меня сейчас.
3. Но вы не просто отвечаете на свой вопрос для себя. У других могут быть похожие проблемы, но без ваших ограничений, и это сломает их.
4. @chepner Ок . Прохладный