Использование переменной bash при перенаправлении ввода с помощью команды сортировки

#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 Ок . Прохладный