2012-03-26 34 views
1

如何在執行svn更新時從控制檯逐行讀取輸入。如何從外殼中的控制檯逐行輸入抓取

!/bin/bash 
for line in $(svn update) 
do 
    printf "$line\n"; 
done 

這將逐字打印出來。我需要它逐行 例如:

A paris/input/hyb/shmc/com//hwmca/workload/eam/tasks/create/res/newap.java 
M paris/input/hyb/shmc/com//hwmca/workload/eam/tasks/create/res/telap.html. 
D paris/input/hyb/shmc/com//hwmca/workload/eam/tasks/create/res/newap_subdirs.mak. 
U paris/input/hyb/shmc/com//hwmca/workload/eam/tasks/create/res/ABC.png 

從控制檯

搶上面的文件如何到grep的文件(A M d U)的開頭在上面,並採取行動?

如果A 緊接着svn導入文件:/// 網絡

如果M 然後.. 網絡

等爲d和U

+0

**哪些業務任務**你嘗試解決:

以上腳本將如下與5日線的問題? – 2012-03-26 16:39:49

回答

1

喜歡的東西

svn update | while read LINE; do 
... 
done 

閱讀更多關於shell中的「讀取」命令。

請注意,shell變量裏面的變化,而不會看到塊外(這是殼依賴,但大多數不會導出它們)。

另一種方法是將IFS重新定義爲單個'\ n'字符,但這不能在任何地方工作 - 通常可以看到解析shell中的錯誤。我不瞭解那裏的穩定性。

通常情況下,編寫比shell更高級的腳本(例如Perl)會更好。

+1

+ +1爲了回答'... while read line' -l'爲了更好地將這些腳本寫在更先進的東西上「;-) ..祝大家好運。 – shellter 2012-03-26 13:50:29

+0

謝謝。這是有幫助的! – user1292259 2012-03-27 05:18:53

+0

可以請你告訴我如何grep的文件修飾符,如果它是一個M D U內while循環?參考上面的例子 – user1292259 2012-03-27 05:32:45

1

UPDATE_LOG是您選擇的文件,它將被命名爲例如「svn_update_2012-05-13.1336839745」,其中後綴數字位於「。」之後。自'1970-01-01 00:00:00 UTC'之後是秒。或者在納秒內使用%N。

#!/bin/sh 

set -e 

UPDATE_LOG=/tmp/svn_update_$(date +%F.$s) 

svn update > $UPDATE_LOG 

while read -r line; do 
    filename=${line#* } 
    case ${line%% *} in 
    A) 
     # svn import file:/// $filename ? 
     ;; 
    D) 
     # so on ... 
     ;; 
    M) 
     # ... 
     ;; 
    U) 
     # so on ... 
     ;; 
    *) 
     echo "He's Dead, Jim!" 
     exit 1 
     ;; 
    esac 
done << $UPDATE_LOG 

備註:

A paris/input/hyb/shmc/com//hwmca/workload/eam/tasks/create/res/newap.java 
M paris/input/hyb/shmc/com//hwmca/workload/eam/tasks/create/res/telap.html. 
D paris/input/hyb/shmc/com//hwmca/workload/eam/tasks/create/res/newap_subdirs.mak. 
U paris/input/hyb/shmc/com//hwmca/workload/eam/tasks/create/res/ABC.png 
    paris/input/hyb/shmc/com//hwmca/workload/eam/tasks/create/res/He_s_Dead.Jim 
相關問題