我真的不明白为什么会发生这种情况,bash似乎在while
循环中运行时删除了命令。
我有以下脚本:
adb shell ls /foo/bar | while read file
do
folder="/foo/bar/$file"
adb pull $folder download
done
当我单独运行命令时,效果很好。但是,我这样运行它,我得到以下输出:
' 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 :(得分:1)
我不知道你的意思是“为什么不允许CR?”。正确的问题是“读取CR的内容是什么?”。除非另有说明,read
使用CR进行参数分割。在bash-manual中查看变量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”,因为它有一个左边和右边的分隔符。