2017-06-02 169 views

回答

3

其分解:

  • *\ *是文件名glob模式。这扩展到当前目录中的所有文件中都有空格。通常会将参数与命令分开(这会在全局扩展之前发生),但在使其成为文字空间并因此成为全局模式的一部分之前有一个转义。

  • for f in *\ *;是一个for循环,循环遍历in之后的所有内容 - 在这种情况下,glob扩展的文件列表。变量f将依次设置为每个文件名,并且将为每个文件名执行直至done命令的代码。

  • "$f"是一个变量扩展。变量扩展之前字拆分(不像glob扩展),所以引号是必要的,以保持文件名中的空格togther作为单个参数的一部分,而不是分成多个参数。

  • ${f// /_}是一个带替代的变量扩展。最初的//表示该模式重复应用于变量内容,而不仅仅是一次。 / /之间的空格是要搜索的模式,最后的_是替换,因此f(循环中的文件名)中的所有空格都将替换为下划线。

+0

哇,谢谢!我们中有些人正在试图打破这种情况,但从未见过这样的命令。 – Ambrose

1

要了解此代码,您可能需要了解更多关于globbing和Bash parameter expansion的信息。

  • *\ * =>是匹配在当前目录中具有一个以上的空间在他们
  • ${f// /_} =>击参数扩展替换用-空间在可变f(1所有条目中的glob:1更换)

因此,循环于当前目录(文件,目录,在其名称中含有空格,并将其重命名为到位的空间使用_名称符号链接等)拿起所有条目。

0

令人困惑的扩展是参数替换。表格${foo/bar/baz}用于搜索$foo中的字符串bar,并用baz替换它。如果bar/开头(如循环中的情况),则全部出现的bar被替换为baz。有关更多信息,您可以阅读bash手册页中的Parameter Expansion标题。

相关问题