2013-01-10 114 views
2

我正在編寫一個shell腳本,它能讓我獲得svn中某個目錄的狀態,然後通過它循環並添加或刪除這些文件。bash循環中的多個變量

這SVN命令

​​

回報文件,我要麼添加或刪除本地。 ? =加,! =刪除

!  /myLocalDir/files/deletedPicture.png 
?  /myLocalDir/files/addedPicture.png 

在我的bash腳本中使用循環(見下文)。我需要做的是,當我循環通過已添加或刪除的文件/文件夾的根目錄時,我需要

A.打印出「正在刪除」[X]或「添加」 X]

B.根據第一個字符(?,!)確定是否應該將循環中的當前文件刪除或添加到svn。

我只是不知道如何解析字符串「!/myLocalDir/files/deletedPicture.png」語法來做到這一點

for X in `svn status /myLocalDir/files | cut -c 8-300` 
      do 
       if [ "!" ] 
        then 
         echo "Deleting " $X 
         #svn $CREDENTIALS delete $X 
        else 
         echo "Adding " $X 
         #svn $CREDENTIALS add $X 
       fi 

      done 

一兩件事我注意到..甚至以爲SVN的狀態了。在命令行

!  /myLocalDir/files/deletedPicture.png 
?  /myLocalDir/files/addedPicture.png 

我的bash環回聲的這樣

!   
/myLocalDir/files/deletedPicture.png 
? 
/myLocalDir/files/addedPicture.png 

回答

2

感謝您的所有輸入!但這是我去的..我所需要做的是確定基於字符串的第一個字符是刪除和哪些是添加,所以我substring'd它。我用短劃線替換了空格,這解決了我的循環問題,然後我爲每個條件子串字符串。

for X in `svn status /myLocalDir/files |tr " " "-"` 
      do 
       if [ ${X:0:1} == "!" ] 
        then 
         echo "Deleting " ${X:8} 
         svn delete ${X:8} 
        elif [ ${X:0:1} == "?" ] 
         echo "Adding " ${X:8} 
         svn add ${X:8} 
       fi 

      done 
+0

這是來自svn help status'?'項目不在版本控制下 '!'項目丟失(由非svn命令刪除)或不完整 –

1

如果你想要ŧ O檢查是第一個字,並考慮其餘爲第二個字,那麼你可以這樣做:

svn status /myLocalDir/files | while IFS= " " read -r line; 
      do 
      read a b <<<$line 

       if [ $a == "!" ] 
        then 
         echo "Deleting " "$b" 
         #svn $CREDENTIALS delete $b 
        else 
         echo "Adding " "$b" 
         #svn $CREDENTIALS add $b 
       fi 
      done 
+0

狀態比兩個狀態有更多的變化,請閱讀'svn help status'。你失敗 –

+0

我不知道它會打印多少列,如前所述。如果只需要檢查第一個單詞,那麼這將起作用。 –

+0

簡易懶惰獾..他的第一個解決方案是不是基地 –

3

X只會是一個字段,而不是整條生產線,你的代碼編寫方式。試試這個:

while IFS= read -r status file; do 
    case $status in 
     \!) echo "Deleting" ;; 
     \?) echo "Adding" ;; 
     # etc. 
    esac 
done <(svn status /myLocalDir/files) 

你可以改變模式,以什麼狀態代碼svn status回報相匹配,並且把你的地方echo S在這個框架需要的任何代碼。

編輯:添加Josh的代碼的答案提供更好的格式:

while read -r line; do 
    file="${line#????????}"  # Strip off the 7 flag columns and the separator 
    status="${line%$file}"   # Get the 7 flags columns 
    case "$status" in 
     '!'*) echo "Do something" ;; 
     '?'*) echo "Do something else with $file";; 
    esac 
done <(svn status /myLocalDir/files) 
+1

如果有任何_additional_標誌存在,則會中斷。解決這個問題的一種方法是改變條件並使用參數擴展:'while IFS = read -r line; do file =「$ {line#????????}」;狀態= 「$ {行%$文件}」; 「!'中的」$ status「情況*)echo」用$ file做某事「;; '?'*)echo「用$ file做別的事情」;; ESAC;完成' –

+0

好點。我有一段時間沒有使用'svn',並且完全忘記了'status'命令可能返回的內容。 – chepner

+0

您需要修改編輯以包含取消設置讀取調用的IFS,否則將刪除前導空白(這很糟糕,因爲那樣會破壞參數擴展以刪除列)。 –

0

OK,你可以更輕鬆優雅的(或者甚至是正確的)方式

  • 添加都這樣做樹中的新文件在一個命令中:svn add --force /myLocalDir/files/*( - 因爲已經有版本控制的文件,所以需要force,否則產生警告「...已經在版本控制之下」),也許它可以在沒有--force的情況下使用,但用-q來抑制outp UT
  • 一行程序與管道添加|刪除沒有大的bash化:

svn status | awk '/\?/ {print $2}' | xargs svn add

svn status | awk '/\!/ {print $2}' | xargs svn rm

+0

甚至是'svn status | sed -ne's/^?/ svn add/p; s/^!/ svn rm/p'|只要文件名不包含不兼容的字符,如空格。 – Graham

0

編輯:增加了對統計所有可能的領域。請參閱svn help status瞭解其含義和數值。

treeConflict=" " 
oldIFS="$IFS" 
IFS=$'\n' 
for line in $(svn stat "$path") 
do 
    if [[ "$treeConflict" == "C" ]]; then 
     continue # skip or handle tree conflict line 
    fi 

    operation="${line:0:1}" 
    modifications="${line:1:1}" 
    lock="${line:2:1}" 
    history="${line:3:1}" 
    external="${line:4:1}" 
    repoLock="${line:5:1}" 
    treeConflict="${line:6:1}" 
    file="$(echo ${line} | sed "s#^.......##")" 
done 
IFS="$oldIFS" 
+0

我所關心的是?要麼 !添加或刪除文件 –

+0

然後忽略不需要的字段。你仍然有$操作和$文件。 – Eugene