【问题标题】:Using bash script to update number in a php script file [duplicate]使用 bash 脚本更新 php 脚本文件中的数字 [重复]
【发布时间】:2015-01-29 12:29:17
【问题描述】:

我使用以下 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 句点 (.) 之后的数字并将其加一?

v1.0.5 将变为 v1.0.6

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

【问题讨论】:

标签: linux git bash shell


【解决方案1】:

感谢 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'));

?>

然后我创建了以下名为 version_updater.shgawk 脚本(在我的 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 文件。现在,当我提交时,我使用新版本号提交。

【讨论】:

    【解决方案2】:

    如果您想要一个“纯 bash”解决方案,这里是...:

    #!/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
    • 这个版本使1.0.9变成1.1.0 - 是否可以使数字上升到99而不是使9成为最大值?
    • 例如1.0.9应该变成1.0.101.0.99变成1.1.0等等...
    猜你喜欢
    • 2012-07-04
    • 2020-03-30
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2013-06-20
    • 1970-01-01
    相关资源
    最近更新 更多