1

我正在尝试解析 svn info 上的输出,而不使用像 sed 或 awk 这样的外部 shell 命令。这纯粹是学术性的,因为我知道我可以使用这些工具在心跳中做到这一点。

我正在解析的输出是:

Path: .
URL: svn://brantwinter@192.168.10.222/handbrake_batch/trunk/handbrake
Repository Root: svn://ilium007@192.168.10.222/handbrake_batch
Repository UUID: 99c2cca7-102b-e211-ab20-02060a000c0b
Revision: 6
Node Kind: directory
Schedule: normal
Last Changed Author: ilium007
Last Changed Rev: 6
Last Changed Date: 2012-11-10 19:00:35 +1000 (Sat, 10 Nov 2012)

这是我的代码:

#!/bin/bash

#set -x

OLD_IFS="$IFS"
IFS=$'\r\n'

# Get the output from svn info into an array
SVN_INFO_ARR=(`svn info`)
COUNT=0
for i in ${SVN_INFO_ARR[@]}; do
    echo $COUNT
    echo "$i"
    (( COUNT++ ))
done

# Get the element that says "Revision: 6"
REV_ARR=${SVN_INFO_ARR[4]}

# Testing the loop over what should be a two element array
COUNT=0
for i in ${REV_ARR[@]}; do
    echo $COUNT
    echo "$i"
    (( COUNT++ ))
done

#This should give the number 6 (or string or something)
REV_NUMBER=${REV_ARR[1]}

echo ${REV_NUMBER}

### INCREMENT REVISION NUMBER FROM ARRAY ELEMENT ###

#NEW_REV_NUMBER= ????? + 1

IFS="$OLD_IFS"

我希望能够接受字符串:

修订:6

并拉出 6 并递增 1,以便我可以更新要包含在 SVN 提交中的发布 txt 文件。

我试着让那个 6 变成 7 一个小时,我觉得自己像个白痴,因为我做不到。

4

4 回答 4

3

你需要括号: 改变这个:

# Get the element that says "Revision: 6"
REV_ARR=${SVN_INFO_ARR[4]}

对此:

# Get the element that says "Revision: 6"
REV_ARR=(${SVN_INFO_ARR[4]})

#This should give the number 6 (or string or something)
REV_NUMBER=${REV_ARR[1]}

这样您就可以:

((REV_NUMBER++))

编辑:

正如你所写:

SVN_INFO_ARR=(`svn info`)

而不仅仅是:

SVN_INFO_ARR=`svn info`

括号用于在 bash 中定义一个数组。看一下:

man -Len -P'less +"/^ *Arrays"' bash
于 2012-11-10T14:05:57.067 回答
3

而不是硬编码数组索引,更好的方法是过滤掉您需要的行并提取数字

这是使用正则表达式的一种方法(Bash 4)

while read -r line; do
    if [[ $line =~ Revision:\ ([0-9]+) ]]; then
         new_rev_num=$((BASH_REMATCH[1]+1))
         echo $new_rev_num
         break
    fi
done < $(svn info)
于 2012-11-10T14:41:23.717 回答
0

用于grep仅选择您需要的行。然后,使用参数扩展删除“修订:”。最后,let用来做算术:

REVISION=$(svn info | grep '^Revision:')
REVISION=${REVISION#* }
let REVISION++
于 2012-11-10T13:48:16.277 回答
0

这段代码最终起作用了:

#!/bin/bash

set -x

OLD_IFS="$IFS"
IFS=$'\r\n'

# Get the output from svn info into an array
SVN_INFO_ARR=(`svn info`)

IFS="$OLD_IFS"

# Get the element that says "Revision: 6"
REV_ARR=(${SVN_INFO_ARR[4]})

#This should give the number 6 (or string or something)
REV_NUMBER=${REV_ARR[1]}
echo $REV_NUMBER
echo $(( REV_NUMBER + 1 ))

上面的答案让我困惑了一段时间,因为它缺少前面的 $:

echo $(( REV_NUMBER + 1 ))

并且((REV_NUMBER++))符号不起作用,我仍然得到 6,而不是 7:

+ OLD_IFS='     
'
+ IFS='
'
+ SVN_INFO_ARR=(`svn info`)
++ svn info
+ IFS='     
'
+ REV_ARR=(${SVN_INFO_ARR[4]})
+ REV_NUMBER=6
+ echo 6
6
+ echo 6
6
于 2012-11-10T22:24:43.567 回答