我编写了一个脚本,该脚本替换了包含此格式字符串的文件中版本号的后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
答案 0 :(得分:3)
问题出在perl调用中使用的正则表达式模式中。将其更改为以下行已解决了问题:
perl -i -spe's/\Q$o/$n/g' -- -o="$old_version" -n="$new_version" file1.txt file2.txt
感谢 @ikegami 解决方案