0

该脚本不适用于“?” 案子。当我直接在命令行中运行时......工作正常但在脚本中无法运行“?” 健康)状况。

  svn st svn_promote_WP
  M       svn_promote_WP\Code\Environment\DEV\properties\build.properties
  M       svn_promote_WP\Code\Environment\RT\properties\build.properties
  ?       svn_promote_WP\props.pl

这是我的脚本:

 #!/usr/bin/sh

 meta_data=(`svn st svn_promote_WP | cut -c1`)
 meta_files=(`svn st svn_promote_WP | awk '$1~/^[AMD?]$/{for(i=2;i<=NF;i++)print $i}'`)

 for index in ${!meta_data[*]}
 do
    if [ ${meta_data[$index]} = "?" ]; then
    echo "${meta_files[$index]} need to be added"
    elif [ ${meta_data[$index]} = "M" ]; then
    echo "${meta_files[$index]} are modified"
    fi
 done

输出:

 svn_promote_WP\Code\Environment\DEV\properties\build.properties are modified
 svn_promote_WP\Code\Environment\RT\properties\build.properties are modified

期望的输出:

  svn_promote_WP\Code\Environment\DEV\properties\build.properties are modified
  svn_promote_WP\Code\Environment\RT\properties\build.properties are modified
  svn_promote_WP\props.pl need to be added

更新了更多详细信息 - 在命令行上运行时的结果:

$ svn st svn_promote_WP | cut -c1
M
M
?


$ svn st svn_promote_WP | awk '$1~/^[AMD?]$/{for(i=2;i<=NF;i++)print $i}'
svn_promote_WP\Code\Environment\DEV\properties\build.properties
svn_promote_WP\Code\Environment\RT\properties\build.properties
svn_promote_WP\props.pl
4

2 回答 2

1

这是一个引用问题,但不是微不足道的问题。首先,您没有${meta_data[$index]}在测试中用双引号括起来。其次,?在数组赋值中已经扩展了。不幸的是,第二个问题不能通过添加双引号来解决;你需要一些更棘手的东西,即

set -f
meta_data=(`svn st svn_promote_WP | cut -c1`)
meta_files=(`svn st svn_promote_WP | awk '$1~/^[AMD?]$/{for(i=2;i<=NF;i++)print $i}'`)
set +f

什么原因?在您的原始代码中,bash 对 的输出执行两个操作svn st svn_promote_WP | cut -c1:每当遇到空格时将其拆分为单个单词,并扩展通配符(= 文件名扩展)。因此,如果您z在当前目录中有文件,?则替换为z. 双引号`svn st svn_promote_WP | cut -c1`将防止分词和文件名扩展,因此整个输出svn st svn_promote_WP | cut -c1未修改地分配给第一个数组元素。但是你需要一些不同的东西,即“保持分词,但防止文件名扩展”。为了获得这种效果,您必须省略双引号并使用禁用文件名扩展的 shell 选项,即-f. 赋值完成后,可以通过执行恢复正常的shell行为set +f.

于 2013-05-29T15:04:22.940 回答
0

引用变量的用法:

if [ "${meta_data[$index]}" = "?" ]; then
echo "${meta_files[$index]} need to be added"
elif [ "${meta_data[$index]}" = "M" ]; then
echo "${meta_files[$index]} are modified"
fi
于 2013-05-29T15:03:57.253 回答