该脚本不适用于“?”案件。当我直接在命令行运行...工作正常但在脚本中无法运行“?”条件。
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 :(得分: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行为。
答案 1 :(得分: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