bash脚本无法获取变量

时间:2013-06-13 16:26:55

标签: bash for-loop scripting awk cut

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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


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

答案 1 :(得分:0)

这应该为您提供修订列表

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

如果您想循环浏览所有修订

r