首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell脚本中向数组元素添加整数时出错

在shell脚本中向数组元素添加整数时出错
EN

Stack Overflow用户
提问于 2012-11-10 11:58:30
回答 4查看 2.6K关注 0票数 1

我试图解析svn上的输出,而不求助于外部shell命令,比如sed或awk。这纯粹是学术性的,因为我知道我可以用这些工具在心跳中做到这一点。

我正在分析的输出是:

代码语言:javascript
复制
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)

这是我的代码:

代码语言:javascript
复制
#!/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,我觉得自己像个白痴,因为我做不到。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-10 14:05:57

您需要括号:更改以下内容:

代码语言:javascript
复制
# Get the element that says "Revision: 6"
REV_ARR=${SVN_INFO_ARR[4]}

对此:

代码语言:javascript
复制
# Get the element that says "Revision: 6"
REV_ARR=(${SVN_INFO_ARR[4]})

在此之前

代码语言:javascript
复制
#This should give the number 6 (or string or something)
REV_NUMBER=${REV_ARR[1]}

所以你可以:

代码语言:javascript
复制
((REV_NUMBER++))

编辑:

正如你所写的:

代码语言:javascript
复制
SVN_INFO_ARR=(`svn info`)

而不是仅仅:

代码语言:javascript
复制
SVN_INFO_ARR=`svn info`

在bash中使用括号来定义数组。看一下:

代码语言:javascript
复制
man -Len -P'less +"/^ *Arrays"' bash
票数 3
EN

Stack Overflow用户

发布于 2012-11-10 14:41:23

与其硬编码数组索引,更好的方法是筛选出所需的行并提取数字。

这里有一种使用regex (Bash 4)的方法

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2012-11-10 13:48:16

使用grep只选择所需的行。然后,使用参数展开删除“修订:”。最后,使用let完成算法:

代码语言:javascript
复制
REVISION=$(svn info | grep '^Revision:')
REVISION=${REVISION#* }
let REVISION++
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13321831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档