与git一起使用时,包含git命令的bash脚本的行为有所不同

时间:2019-05-27 20:03:22

标签: bash git perl

我编写了一个脚本,该脚本替换了包含此格式字符串的文件中版本号的后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 个答案:

答案 0 :(得分:3)

问题出在perl调用中使用的正则表达式模式中。将其更改为以下行已解决了问题:

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

感谢 @ikegami 解决方案