2012-03-12 84 views
1

我真的不明白爲什麼會發生這種情況,bash似乎在運行while循環時刪除命令。 我有以下腳本:Bash正在刪除命令?

adb shell ls /foo/bar | while read file 
do 
    folder="/foo/bar/$file"                                                              
    adb pull $folder download 
done 

當我seperatly運行命令,它的偉大工程。但是,我運行它像這樣,我得到以下輸出:

' does not existfoo/bar/filesdfsdf.sdf 

爲/ foo/bar中的每個文件。

所以我試圖給我的命令後面的字符串,我改echo "adb pull $folder download",得到了以下的輸出:

download/foo/bar/fileasdfs.sdf 

的每一行。看來,bash用字符串做了些什麼,並在這裏取代了一些東西... 如果我使用',所以不會發生bash替換,我會得到正確的輸出。

這裏發生了什麼?

編輯:我想,不是while是直接打破,它的adb shell命令是在每一行結束時回聲CRLF。如果我使用

adb shell ls /foo/bar | tr -d '\015' | while read file 
do 
    folder="/foo/bar/$file"                                                              
    adb pull $folder download 
done 

它的工作原理! 但是爲什麼bash對CRLF過敏?爲什麼它的刪除命令?

+0

嘗試引用您的文件夾var,即'echo adb pull「$ folder」download'。使用'echo'好主意,直​​到你得到你想要的結果!祝你好運。 – shellter 2012-03-12 17:31:19

+1

確定woot哈哈,我想出了adb使用CRLF來回應一個新的行......當我這樣做的時候發瘋,並且劃出命令oO。我添加了一個'| tr -d'\ 015''從adb shell輸出中刪除所有的CR。爲什麼一會兒不允許CR? – reox 2012-03-13 08:36:38

回答

1

我不知道你的意思是「爲什麼不允許CR?」。正確的問題是「用CR做什麼?」。除非另有說明,read使用CR來進行參數分割。查看你的bash手冊中的變量IFS,並看看-d選項來閱讀。

實施例:

bos:$ echo foo bar gazonk | while read x ; do echo $x ; done 
foo bar gazonk 

這裏,CR充當(默認)定界符read。現在,假設你要讀的每一個字分開,那麼你可以使用-d " "(設置SPC作爲分隔符):

$ echo foo bar gazonk hello 123 | while read -d " " x ; do echo $x ; done 
foo 
bar 
gazonk 
hello 

這裏的背面是最後一個參數(123)不輸出,因爲它不以分隔符結束。把分隔符看作是抓住它的所有東西,直到但不包括下一個分隔符。由於「123」不以分隔符結束,最後一個分隔符介於「hello」和「123」之間,因此 - 抓取的內容是「hello」,因爲它有一個左右分隔符。