为什么tr命令在ls输出中用破折号成功替换空格:
a=$(ls) ; b=$(echo $a | tr ' ' -) ; echo $b
虽然我不能通过变量扩展来做同样的事情:
a=$(ls) ; b=${a// /-} ; echo $b
答案 0 :(得分:3)
问题是echo $a
将所有连续的空格序列(包括换行符)压缩到一个空格中。这是word splitting,如手册中所述。如果引用变量,事情会有所不同:
a=$(ls) ; b=$(echo "$a" | tr ' ' -) ; echo $b; echo "$b"
除非您特别想要分词,否则请引用您的变量。
变量赋值不受分词限制,因此此部分b=${a// /-}
仅用连字符替换文件名中的空格,而不是ls
输出中的换行符
请注意,ls
旨在供人眼阅读。不要解析ls
:http://mywiki.wooledge.org/ParsingLs