Сценарий Bash, содержащий команды git, ведет себя по-разному при использовании вместе с perl

Я написал скрипт, который заменяет последние 3 цифры номера версии в файле, содержащем строку в этом формате.

"version-all:255.24.788"

Есть 2 режима работы скрипта: обычный и расширенный. Обычный режим просто вносит необходимые изменения, добавляет файлы в git и фиксирует их. Расширенная версия создает ветку для внесения этих изменений, изменяет файлы, добавляет, фиксирует, а затем возвращается к исходной рабочей ветке.

Я наблюдаю странное поведение при запуске скрипта. Скрипт работает при первом запуске, но при втором запуске он прекращает фиксацию результатов и пытается изменить ветку, что приводит к конфликтам слияния. Я не могу понять, почему скрипт сработает только нечетное количество раз (первый, третий, пятый раз), а когда запустится четное количество раз (второй, четвертый, шестой), произойдет сбой.

Я попытался изменить синтаксис переменных и заменить вызовы perl простым

echo "test" > file1.txt

для целей отладки, и тогда он, кажется, работает нормально. При обратном добавлении команд perl сценарий, кажется, возвращается к своему странному поведению.

#!/bin/bash
# This script replaces last 3 digits of a version number in a file
# There are 2 modes for the script
#   1. Regular - no flag needed, requires 1 argument: a version number
#   2. Advanced - flag "-a" needs to be used followed by 3 arguments: version number, push repo name, remote repo name.

advanced_script=false
version = "none"

if [ "$1" = "-a" ] ; then
    advanced_script=true
fi

if [ "$advanced_script" = true ] ; then 
    if [ $# -ne 4 ] ; then
        echo -e "ERROR: Please supply the following 3 arguments and try again.\n" 
        echo -e "       1. New version number\n"
        echo -e "       2. Push repository name\n"
        echo -e "       3. Remote repository name\n"
        exit 1
    fi
    version = "$2"
else
    if [ $# -ne 1 ] ; then
        echo -e "ERROR: Please supply version number and try again.\n"  
        exit 1
    fi 
    version = "$1"
fi

old_version_full = "version-all:255.24.788"
old_version=${old_version_full##*all:}
new_version=${old_version%.*}
new_version+ = ".${version}"

current_branch=$(git branch | grep \* | cut -d ' ' -f2)
commit_string = "Bump the version to $version"

if [ "$advanced_script" = true ] ; then 
    local_branch = "new_$version"
    remote_master = "$4/master"
    git stash
    git checkout -b "$local_branch" "$remote_master"
fi 

perl -i -pe"s/${old_version}/${new_version}/g" file1.txt
perl -i -pe"s/${old_version}/${new_version}/g" file2.txt

git add file1.txt
git add file2.txt

git status

git commit -m "$commit_string"

if [ "$advanced_script" = true ] ; then 
    git push "$3"
    git checkout "$current_branch"
    git stash apply
fi
git stash иногда ничего не делает и не создает тайник. Если это так, ваш более поздний git stash apply применит некоторый тайник разное, если он есть, или просто потерпит неудачу; ни то, ни другое не кажется хорошей идеей. Вероятно, это не связано с проблемой, которую вы видите, но, возможно, это так, трудно сказать, поскольку здесь нет минимальный воспроизводимый пример.
torek 27.05.2019 22:21

Вероятно, не связанная проблема: . имеет особое значение в регулярном выражении Perl, поэтому ваш шаблон не соответствует тому, что вы думаете. Исправьте это и связанные с ним ошибки внедрения кода следующим образом: perl -i -spe's/\Q$o/$n/g' -- -o = "$old_version" -n = "$new_version" file1.txt

ikegami 27.05.2019 22:22

Совет: Вы можете объединить оба вызова в perl: perl -i -spe's/\Q$o/$n/g' -- -o = "$old_version" -n = "$new_version" file1.txt file2.txt

ikegami 27.05.2019 22:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема была в шаблоне регулярного выражения, используемом в вызове Perl. Изменение следующей строки решило проблему:

perl -i -spe's/\Q$o/$n/g' -- -o = "$old_version" -n = "$new_version" file1.txt file2.txt

Спасибо @ikegami за решение

Другие вопросы по теме