【问题标题】:bash script unable to get the variablebash脚本无法获取变量
【发布时间】:2013-06-10 03:30:05
【问题描述】:

在命令行上是这样工作的:

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

【问题讨论】:

  • ' /$ticket/{print $1}' 不会在单引号中展开尝试双引号
  • 向我们展示你的输入和你的预期输出,更容易重写整个事情......这不是你想要这样做(或任何事情)的方式。
  • 现在更新了 - 命令行输出和我如何编写脚本。
  • 双引号也不起作用。
  • 为什么${!revs[*]}的感叹号?我猜您只想循环遍历数组并打印内容...并且正确的语法是 ${revs[@]} 循环遍历数组。要调试,请将 shebang 更改为 #!/usr/bin/bash -x

标签: bash for-loop scripting awk cut


【解决方案1】:

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

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

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


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

【讨论】:

  • 我正在尝试根据用于签入/提交并将输出重定向到文件的票证在版本控制中进行修订。我只需要修订号
  • 您的评论无济于事 - 编辑问题并告诉我们您要做什么,显示输入和预期输出。另外请取消接受@unxnut回答信息不正确。
  • sudo_O - 使用预期输入和所需输出编辑问题。希望信息得到正确解释。
【解决方案2】:

这应该会给你修订列表

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

如果你想遍历所有的修订版

for revisions in "${revisions[@]}"; do
    echo $revisions
done 

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2011-01-28
    相关资源
    最近更新 更多