使用bash脚本更新php脚本文件中的数字

时间:2014-12-01 13:23:54

标签: linux git bash shell

我使用以下bash / shell脚本在我的项目中半自动化git add / commit / push例程:

git_push.sh

#!/bin/bash

# Mini Config
RColor='\e[0m'
Red='\e[0;31m';
Green='\e[0;32m';
Yellow='\e[0;33m'

# Change To Working Directory
clear;
cd $HOME/public_html/iwms_reboot;

# Get Git Commit Notes
echo -en "\r\n${Green}Enter commit notes: ${Yellow}";
read notes;
if [[ -z "$notes" ]]
then
    echo -e "\r\n${Red}ERROR: You have not entered any git commit notes.${RColor}\r\n";
    exit 0;
fi
echo -e "${RColor}";

# Git Add, Commit & Push
git add .;
git commit -m "${notes}";
echo -e "\r\n";
git push;
echo -e "\r\n";

这完全没问题。

我想更进一步。在我的项目中,有一个名为 version.php 的文件,其中包含以下代码行:

<?php

// Script Version
$script_version = 'v1.0.5';

?>

我的问题是,是否可以使用bash / shell脚本加载此文件的内容并在2nd句点(.)之后找到该数字并将其递增1?

即。 v1.0.5将成为v1.0.6

这样,我可以在我的(git add / commit / push)例程之前运行此版本号更新功能,以在我的项目上实现自动minor version号码更新功能。即每次提交时,脚本版本号都会自动上升。

2 个答案:

答案 0 :(得分:1)

如果你想要&#39; pure-bash&#39;解决方案,这是......:

#!/bin/bash

new_version=''
increment_version_number () {
  declare -a part=( ${1//\./ } )
  declare    new
  declare -i carry=1

  for (( CNTR=${#part[@]}-1; CNTR>=0; CNTR-=1 )); do
    len=${#part[CNTR]}
    new=$((part[CNTR]+carry))
    [ ${#new} -gt $len ] && carry=1 || carry=0
    [ $CNTR -gt 0 ] && part[CNTR]=${new: -len} || part[CNTR]=${new}
  done
  new="${part[*]}"
  new_version="${new// /.}";
}

version=$(sed version.php -e "s/\$script_version = 'v//" | sed -e "s/';$//")
increment_version_number $version

echo $new_version;

<强>更新 两位数版本号的代码(在评论中要求):

#!/bin/bash

new_version=''
increment_version_number () {
  declare -a part=( ${1//\./ } )
  declare    new
  declare -i carry=1

  for (( CNTR=${#part[@]}-1; CNTR>=0; CNTR-=1 )); do
    len=${#part[CNTR]}
    new=$((part[CNTR]+carry))
    [ ${#new} -gt $(($len+1)) ] && carry=1 || carry=0
    part[CNTR]=${new}
  done
  new="${part[*]}"
  new_version="${new// /.}";
}

version=$(grep "\$script_version" version.php | sed -e "s/\$script_version = 'v//" | sed -e "s/';$//")
increment_version_number $version

echo $new_version;

(警告:未完全测试的代码......)

答案 1 :(得分:0)

感谢 fredtantini 并使用How to increment version number in a shell script?的答案,我已经针对原来的问题提出了以下解决方案。

我首先创建了一个名为 version.data 的文件,并将文本 1.0.5 放入其中。

然后我更新了我的PHP脚本:

<?php

// Script Version
$script_version = 'v'. trim(file_get_contents(app_path() .'/version.data'));

?>

然后我创建了以下gawk脚本,名为 version_updater.sh (在我的 git_push.sh 脚本旁边):

#!/usr/bin/gawk -f

BEGIN {
    printf("%s", inc(ARGV[1]))
}

function inc(s, a, len1, len2, len3, head, tail)
{
    split(s, a, ".")

    len1 = length(a)
    if(len1==0)
        return -1
    else if(len1==1)
        return s+1

    len2 = length(a[len1])
    len3 = length(a[len1]+1)

    head = join(a, 1, len1-1)
    tail = sprintf("%0*d", len2, (a[len1]+1)%(10^len2))

    if(len2==len3)
        return head "." tail
    else
        return inc(head) "." tail
}

function join(a, x, y,    s)
{
    for(i=x; i<y; i++)
        s = s a[i] "."
    return s a[y]
}

然后我更新了我的 git_push.sh 脚本:

#!/bin/bash

# Mini Config
RColor='\e[0m'
Red='\e[0;31m';
Green='\e[0;32m';
Yellow='\e[0;33m';
Source=$HOME/public_html/iwms_reboot;

# Increment Script Version
CurrentVersion=`cat "$Source/app/version.data"`;
NewVersion=`./version_updater.sh $CurrentVersion`;

# Change To Working Directory
clear;
cd $Source;

# Get Git Commit Notes
echo -en "\r\n${Green}Enter commit notes: ${Yellow}";
read notes;
if [[ -z "$notes" ]]
then
    echo -e "\r\n${Red}ERROR: You have not entered any git commit notes.${RColor}\r\n";
    exit 0;
fi
echo -e "${RColor}";

# Update Script Version
echo $NewVersion > $Source/app/version.data;

# Git Add, Commit & Push
git add .;
git commit -m "${notes}";
echo -e "\r\n";
git push;
echo -e "\r\n";

......就是这样,它有效。

当脚本运行时,它会读取当前版本,将其传递给version_updater.sh以编程方式递增它并将返回值放入变量中。

在我提交之前,我使用更新的版本号更新我的version.data文件。现在,当我提交时,我提交了新的版本号。