Bash 如何在命令行中将值数组传递给shell脚本并在循环中给出建议

Bash 如何在命令行中将值数组传递给shell脚本并在循环中给出建议,bash,shell,svn,awk,Bash,Shell,Svn,Awk,目标是根据修订号仅从svn日志中获取文件名。每个提交在svn注释中都有一个jira票证号,因此svn修订是通过查找jira票证号获得的 到目前为止,当我只给出一个jira票号时,脚本工作正常,但当我给出多个jira票号时,我需要让它工作 这个脚本的问题是,输出只有来自ticket-2的值。如何使输出同时包含ticket-1和ticket-2的值 我需要一些关于如何将ticket-1和ticket-2作为参数传递给脚本而不是在脚本中分配它们的帮助 代码: tl;博士 因为第二个循环处理转速在第一个

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

到目前为止,当我只给出一个jira票号时,脚本工作正常,但当我给出多个jira票号时,我需要让它工作

这个脚本的问题是,输出只有来自ticket-2的值。如何使输出同时包含ticket-1和ticket-2的值

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

代码:

tl;博士 因为第二个循环处理转速在第一个循环设置转速之外。将第二个循环移动到第一个循环内以解决此问题

详细维修 这个脚本需要认真修改

数组jira_ticket的声明不正确-它应该是jira_ticket=ticket-1 ticket-2。 要循环遍历数组中的每个元素,请使用${array[@]}引号对于避免意外的分词非常重要,使用@而不是*可以将扩展拆分为每个元素一个单词,这就是您所追求的$数组相当于${array[0]}。 在数组的键上循环的原理相同:说${!数组[@]},而不是${!数组[*]}。 如果可以循环值而不需要键,为什么还要循环键呢? 循环中的变量赋值不能保证从循环中传播出去,它们可能在这里,但奇怪的事情发生在管道中等等。 你的意思是在第一个循环中执行第二个循环,使用每一个revs副本吗?目前你只处理最后一份。 请将所有变量展开式报价为$1,而不是$1。 请使用现代命令替换语法$command而不是反引号。它不太容易出错。 您需要正确设置IFS以正确分割命令替换结果。我想你想要的是$IFS'\n';我可能错了。 将票作为论据传递 在处理$1后使用shift除去$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
tl;博士 因为第二个循环处理转速在第一个循环设置转速之外。将第二个循环移动到第一个循环内以解决此问题

详细维修 这个脚本需要认真修改

数组jira_ticket的声明不正确-它应该是jira_ticket=ticket-1 ticket-2。 要循环遍历数组中的每个元素,请使用${array[@]}引号对于避免意外的分词非常重要,使用@而不是*可以将扩展拆分为每个元素一个单词,这就是您所追求的$数组相当于${array[0]}。 在数组的键上循环的原理相同:说${!数组[@]},而不是${!数组[*]}。 如果可以循环值而不需要键,为什么还要循环键呢? 循环中的变量赋值不能保证从循环中传播出去,它们可能在这里,但奇怪的事情发生在管道中等等。 你的意思是在第一个循环中执行第二个循环,使用每一个revs副本吗?目前你只处理最后一份。 请将所有变量展开式报价为$1,而不是$1。 请使用现代命令替换语法$command而不是反引号。它不太容易出错。 您需要正确设置IFS以正确分割命令替换结果。我想你想要的是$IFS'\n';我可能错了。 将票作为论据传递 在处理$1后使用shift除去$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

这里有很多可靠的建议,但是使用array=$。。。这是一件非常值得畏缩的事情。如果没有其他问题,那么使用mapfile-t array会更干净。<另外要记住的是,不能保证svn日志将来不会以向后不兼容的方式更改,除非您使用svn log-xml和XMLStarlet之类的工具来解析其输出。@CharlesDuffy 1我试图使代码保持在某种程度上可被OP识别的状态,同时尝试稍微清除它,如果s=$'\n'。如果您想在mapfile中编辑,请这样做。2我从来没有使用过Subversion,所以我不知道这些东西。再次,请随意编辑。运行上述脚本后,Cut似乎没有问题,但我得到了以下错误:Cut:您必须指定一个字节、字符或字段的列表。有关详细信息,请尝试Cut-help。`此脚本可以工作,但排序是从高到低,而不是从低到高……有帮助吗?这里有很多可靠的建议,但是使用数组=$。。。这是一件非常值得畏缩的事情。如果没有其他问题,那么使用mapfile-tarray会更干净。<另一件需要记住的事情是,不能保证svnlog不会更改
除非您使用svn log-xml并因此使用XMLStarlet等工具来解析其输出,否则将来将以向后不兼容的方式进行。@CharlesDuffy 1我试图使代码保持在某种程度上可识别的OP条件下,同时尝试在IFS=$“\n”的情况下对其进行清理。如果您想在mapfile中编辑,请这样做。2我从来没有使用过Subversion,所以我不知道这些东西。再次,请随意编辑。运行上述脚本后,Cut似乎没有问题,但我得到了以下错误:Cut:您必须指定一个字节、字符或字段的列表。有关详细信息,请尝试Cut-help。`此脚本可以工作,但排序是从高到低,而不是从低到高……有帮助吗?