BASH: Заполнение файла шаблона строками - PullRequest
1 голос
/ 10 июля 2020

У меня есть шаблонный сценарий с некоторым анализом, и единственное, что мне нужно изменить в нем, это case.

#!/bin/bash
CASE=XXX
... the rest of the script where I use $CASE

Я создал список всех своих cases, которые я сохраняется в файл: list.txt. Таким образом, мой файл list.txt может содержать случаи как XXX, YYY, ZZZ.

Теперь я бы запустил al oop поверх содержимого list.txt и заполнил свой template_script.sh case из list.txt а затем сохранил файл под новым именем - script_CASE.sh

for case in `cat ./list.txt`; 
do
# open template_script.sh
# use somehow the line from template_script.sh (maybe substitute CASE=$case)
# save template_script with a new name script_$case
done

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

В чистом виде bash:

#!/bin/bash

while IFS= read -r casevalue; do
    escaped=${casevalue//\'/\'\\\'\'} # escape single quotes if any
    while IFS= read -r line; do
        if [[ $line = CASE=* ]]; then
            echo "CASE='$escaped'"
        else
            echo "$line"
        fi
    done < template_script.sh > "script_$casevalue"
done < list.txt

Обратите внимание, что сохранение в "script_ $ casevalue" может не работать, если регистр содержит символ /.

Если гарантировано, что значения case (строки в list.txt) не нужно экранировать, тогда использовать sed проще:

while IFS= read -r casevalue; do
    sed -E "s/^CASE=(.*)/CASE=$casevalue/" template_script.sh > "script_$casevalue"
done < list.txt

Но этот подход fr agile завершится ошибкой , например, если значение case содержит символ &. Я считаю, что чистая версия bash очень надежна.

2 голосов
/ 10 июля 2020

Преобразование моего комментария в ответ, чтобы решение было легко найти для будущих посетителей.

Вы можете использовать этот bash скрипт:

while read -r c; do
    sed "s/^CASE=.*/CASE=$c/" template_script.sh > "script_${c}.sh"
done < list.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...