2013-05-29 112 views
0

脚本不适用于“?”案件。当我直接在命令行中运行...工作正常但在脚本中无法运行“?”条件。颠覆文件的shell脚本

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 

回答

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 
+0

没有工作。对于仅修改的文件,我得到的结果相同,但不是测试条件。 – iaav

+0

是的,实际上,我无法重现任何错误行为。所以也许你想更多地讲述这件事。但是,引号不应该被忽略。 – Alfe

+0

我发现很奇怪的是,你用了一个名为'/ usr/bin/sh'的shell,但是提出的代码是'bash'语法(并且用'bash'标记了这个问题)。 – Alfe

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。分配完成后,您可以通过执行set +f来恢复正常的shell行为。