1

sed や awk などの外部シェル コマンドに頼らずに、svn info の出力を解析しようとしています。これらのツールを使用すると、ハートビートでこれを実行できることがわかっているため、これは純粋に学術的なものです。

私が解析している出力は次のとおりです。

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

SVN コミットに含めるリリース txt ファイルを更新できるように、6 を取り出して 1 ずつ増やします。

私は今、その 6 を 7 に変えようと 1 時間試みましたが、それができないので馬鹿のように感じました。

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

配列インデックスをハードコーディングする代わりに、必要な行を除外して数値を抽出する方がよいでしょう。

これが正規表現を使用する1つの方法です(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

このコードは最終的に機能しました:

#!/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++))表記が機能しませんでしたが、7ではなく6を取得しました。

+ 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 に答える
0

grep必要な行のみを選択するために使用します。次に、パラメーター展開を使用して "Revision: " を削除します。最後に、 を使用letして算術演算を行います。

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