2012-03-12 120 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”,因为它有一个左右分隔符。