Сценарий Bash, содержащий команды git, ведет себя по-разному при использовании вместе с Perl - PullRequest
2 голосов
/ 27 мая 2019

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

"версия-все: 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

1 Ответ

3 голосов
/ 28 мая 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...