0

在命令行上,它的工作方式如下:

svn log "$src_url" --stop-on-copy \
  | awk -v RS="--+" -F'|' ' /ticket-101/{print $1}' \
  | grep "^r" \
  | cut -d"r" -f2 \
  | cut -d" " -f1 

输出:

6359
6358
6263
6241
6240
6239
6238
6237
6236

该脚本在硬编码票号时有效,但在我将其分配为变量时无效。我可能需要提供不止一张票,因此需要这个工作。

#!/usr/bin/bash

src_url="$1"
itrack=ticket-101

for ticket in "$itrack"; do
echo $ticket
revs=($(IFS=$'\n';
        svn log "$src_url" --stop-on-copy \
          | awk -v RS="--+" -F'|' ' /"$ticket"/{print $1}' \
          | grep "^r" \
          | cut -d"r" -f2 \
          | cut -d" " -f1 \
          | sort -r
      ))

for revision in ${!revs[*]} ; do

  echo ${revs[$revision]}
done

done

Output gives nothing.

svn我试图解析的命令的输出是:

 $ svn log http://test.svn.com/svn/demo_project --limit 5

 ------------------------------------------------------------------------
 r1000 | testuser25 | 2013-06-13 13:37:10 -0400 (Thu, 13 Jun 2013) | 1 line

 ticket-1135
 ------------------------------------------------------------------------
 r999 | testuser20 | 2013-06-13 13:26:46 -0400 (Thu, 13 Jun 2013) | 2 lines

 ticket-1135
 ------------------------------------------------------------------------
 r998 | testuser30 | 2013-06-13 12:12:12 -0400 (Thu, 13 Jun 2013) | 1 line

 ticket-122
 ------------------------------------------------------------------------
 r997 | testuser25 | 2013-06-13 12:09:56 -0400 (Thu, 13 Jun 2013) | 1 line

 ticket-11
 ------------------------------------------------------------------------
 r900 | testuser40 | 2013-06-13 12:09:53 -0400 (Thu, 13 Jun 2013) | 1 line

 ticket-113
 ------------------------------------------------------------------------

如果输入是:/run.sh http://test.svn.com/svn/demo_project ticket-1135 ticket-122 ticket-113

所需的输出将是:

900
998
999
1000
4

2 回答 2

1

要将 shell 脚本变量的值传递给awk您,您应该使用如下-v选项:

awk -v tick="$ticket" -v RS="--+" -F'|' ' $0~tick{print $1}'

不要执行unxnut建议的操作,因为$1它将被解释为脚本的第一个参数,而不是记录中的第一个字段awk


这可能会暂时解决您的问题,但您的脚本中有一些非常糟糕的做法,为了获得一些实际帮助,您应该告诉我们您正在尝试做什么,显示输入和预期输出,我们可以显示正确的方法。

于 2013-06-13T17:24:29.210 回答
0

这应该为您提供修订列表

revs=($(svn log "$src_url" --stop-on-copy \ 
         | awk -v RS='--+\n' -F'|' '/'"$ticket"'\n/{sub(/^r| $/,""); print $1}'
     ))
  • 注意:我使用awk'ssub()去掉r修订号后面的前导和尾随空格。

如果你想遍历所有的修订

for revisions in "${revisions[@]}"; do
    echo $revisions
done 
于 2013-06-13T19:26:44.957 回答