【问题标题】:Bash: Iterating through files with placeholder [duplicate]Bash:使用占位符遍历文件[重复]
【发布时间】:2016-05-23 16:18:51
【问题描述】:

我想删除一些包含已安装 (--bind) 子目录的目录。我在名为 .du 的脚本文件中使用以下 for 循环。

for dirname in $1; do                                                                                                                                         
    sudo umount $dirname/images/Spielplatz
    sudo umount $dirname/sounds/Spielplatz
    sudo rm -r $dirname
done

我用

调用脚本文件
.du Test*

删除所有以“Test”开头的目录。但它只删除第一个。所以我必须为每个目录调用.du

我如何编写它,以便一次调用处理所有这些?

【问题讨论】:

  • @WalterA,绝对不是in $*——如果你的名字中有空格,那会很糟糕。
  • 顺便说一句,这里还有其他错误。 rm -r $dirname 不会以您想要的方式使用所有可能的名称。将其设为 umount "$dirname/images/Spielplatz"rm -r -- "$dirname" - 带引号 - 以确保可靠性,并考虑通过 shellcheck.net 运行脚本以解决此类问题。

标签: bash loops


【解决方案1】:

在 UNIX 上,与 DOS/Windows 不同,glob 表达式在程序启动之前展开。因此:

.du Test*

运行类似.du Test1 Test2 Test3 的东西(如果这些文件与全局匹配)。因此,$1 指的是Test1,而$2 将是Test2,等等。程序无法知道它最初是在命令行上用Test* 调用的;它给出的只是扩展后的数组。

要遍历此数组中的所有元素,请使用:

for dirname in "$@"; do

【讨论】:

    【解决方案2】:

    它完全按照你的要求做——$1 是第一个参数。要遍历所有参数,请使用 "$@":

    for dirname in "$@"; do
    

    您甚至可以忽略它,因为它是默认设置;

    for dirname; do
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多