1

目标是svn log根据修订号仅获取文件名。每个提交在 svn 注释中都有一个 jira 票号,因此通过查找 jira 票号来获得 svn 修订。

到目前为止,当我只提供一个 jira 票号时,脚本可以正常工作,但当我提供多个 jira 票时,我需要让它工作。

  1. 这个脚本的问题是输出只有来自 ticket-2 的值。如何让输出包含ticket-1 和ticket-2 的值?

  2. 我需要一些关于如何将ticket-1 和ticket-2 作为参数传递给脚本而不是在脚本中分配它们的帮助?

代码:

#!/bin/sh

src_url=$1
target_url=$2
jira_ticket=("ticket-1 ticket-2")

for i in $jira_ticket; do
    revs=(`svn log $1 --limit 10 | grep -B 2 $i | grep "^r" | cut -d"r" -f2 | cut -d" " -   f1|sort -r`)
done

for revisions in ${!revs[*]}; do
    files=(`svn log -v  $1 -r ${revs[$revisions]} | awk '$1~/^[AMD]$/{for(i=2;i<=NF;i++)print $i}'`)
    for (( i = 0; i < ${#files[@]}; i++ )); do
        echo "${files[$i]} @" ${revs[$revisions]} " will be merged."
    done
done
4

1 回答 1

4

tl;博士

因为第二个循环(处理revs)在第一个循环(设置revs)之外。将第二个循环移动到第一个循环内以解决此问题。

详细维修

这个脚本需要一些认真的修复。

  • 数组jira_ticket声明不正确 - 应该是jira_ticket=("ticket-1" "ticket-2").
  • 要遍历数组中的每个元素,请使用"${array[@]}"(引号对于避免意外的单词拆分很重要,并且使用@而不是*将扩展拆分为每个元素一个单词,这就是您所追求的)。$array相当于${array[0]}
  • 与遍历数组键的原理相同:说"${!array[@]}"而不是${!array[*]}.
  • 当您可以循环值并且不需要键时,为什么要循环键?
  • 不能保证循环中的变量赋值会传播出去(它们可能在这里,但在管道等中会发生奇怪的事情)。
  • 您的意思是在第一个循环中执行第二个循环,以使用revs? (就目前而言,您只处理最后一个副本。)
  • 引用您所有的变量扩展("$1", not $1)。
  • 使用现代命令替换语法$(command)而不是反引号。它更不容易出错。
  • 您需要正确设置IFS才能正确拆分命令替换结果。我认为您追求的是 IFS $'\n'; 我可能错了

将票据作为参数传递

shift在处理后使用摆脱$1$1然后将剩下的所有内容分配给jira_tickets数组。

脚本,尽我所能修复:

#!/bin/sh
# First argument is the source URL; remaining args are ticket numbers
src_url="$1"; shift
#target_url="$2"; shift # Never used

# Handy syntax hint: `for i in "$@"; do` == `for i; do`
for ticket; do
  # Fixed below $1 to be $src_url
  revs=($(IFS=$'\n'; svn log "$src_url" --limit 10 | grep -B 2 "$ticket" | grep "^r" | cut -d"r" -f2 | cut -d" " - f1 | sort -r))

  for revision in "${revs[@]}"; do # I think you meant to loop over the values here, not the keys
    files=($(IFS=$'\n'; svn log -v "$src_url" -r "$revision"  | awk '$1~/^[AMD]$/{for(i=2;i<=NF;i++)print $i}'))

    for file in "${files[@]}"; do # Think you wanted to loop over the values here too
      echo "$file @ $revision will be merged."
    done
  done
done
于 2013-05-17T01:45:54.790 回答