2013-05-29 65 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行爲。