【问题标题】:looping through array in bash does not work在bash中循环遍历数组不起作用
【发布时间】:2015-03-24 00:00:49
【问题描述】:

我有一个数组filesToDelete 并获得echo $filesToDelete 的以下输出

value1 value2 value3 value4

当我试图循环遍历数组以从当前文件夹中删除文件时:

for i in '${filesToDelete[@]}'
    do
               # rm $i
              rm $i*.*;
    done

上面写着:

rm: ”${filesToDelete[@]}*.*” can not be deleted: no such file or directroy

文件存在,我在正确的目录中可以执行删除方法,但仍然出现错误。

如果我改变循环:

for i in "${filesToDelete[@]}"

我收到包含 done 的行的 Bad substitution 错误

当我查找谷歌时,建议在第一行使用#!/bin/bash,这对我来说也是如此。

知道如何从数组中删除文件吗?

【问题讨论】:

    标签: arrays bash shell unix


    【解决方案1】:

    这里有一个简单的答案,但是用户出于某种原因删除了它,所以在这里,简单而精彩:)

    for file in $filesToDelete 
        do
        rm "$file"*.*;
    done
    

    这比我的方法简单得多。感谢他,不管他是谁!

    【讨论】:

    • 那么就不涉及数组了。
    • 如果filesToDelete 是一个数组,那么这将不起作用。它只会删除数组中的第一个文件。如果这可行,则表明您有一个包含多个单词的字符串,而不是数组。您应该编辑您的问题以显示变量的定义方式。
    【解决方案2】:

    如果echo $filesToDelete 打印元素列表,则它不是数组;如果它是一个只打印第一个元素的实际数组。我很确定您实际上拥有的只是一个用空格分隔元素的字符串。

    您遇到的直接问题是您已将变量 (/array) 引用放在单引号中,并且 shell 不会在单引号内执行变量扩展。事实上,它不会对单引号的内容进行任何解析(除了查找右引号)。在 shell 中,有 3 个主要的引用上下文:

    • 在单引号内,根本不执行任何解释(变量引用、通配符等)。
    • 在双引号内,变量引用(和其他以$ 开头的东西)已经完成,反引号命令和一些转义(\)序列也是如此。一旦变量(等)被替换,就不会对替换的值进行解析(这几乎总是您想要的)。
    • 当不加引号时,变量引用(和许多其他事情)完成,然后被替换的值被拆分为单词(由空格和其他空格分隔),并替换所有通配符。

    由于 filesToDelete 显然是一个用空格分隔文件名的纯字符串,因此您需要引用它不带引号将其拆分为单词。但是,如果任何文件名包含空格和/或通配符,这可能会导致灾难性的失败。我的标准示例是 Apple 的 iTunes 2.0 安装程序,其中包含删除旧版本的命令;类似rm -R $1。如果旧版本位于例如/Volumes/Data 2/Applications/iTunes.app,这将删除 /Volumes/Data 的全部内容,然后抱怨 2/Applications/iTunes.app 不存在。此后,Apple 很快发布了 2.0.1 版本,唯一的变化是在对 $1 的引用周围添加了双引号。 IIRC 他们还为一些客户购买了数据恢复软件。

    如果您需要安全地存储多个文件名,请使用实数数组。使用filesToDelete=(value1 value2 value3 value4) 之类的内容创建它(请注意,这里也执行分词和通配符扩展,因此将所有变量引用括在双引号中)。然后将其与以下内容一起使用:

    for i in "${filesToDelete[@]}"; do
        rm "$i"*.*
    done
    

    请注意,在rm 命令中,我将双引号括在变量引用周围,但没有将需要解释为通配符的部分。 (另外,在 shell 中,行尾不需要分号,所以我把它去掉了。)

    【讨论】:

      猜你喜欢
      • 2012-05-24
      • 1970-01-01
      • 2020-02-12
      • 2019-02-18
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2022-01-16
      相关资源
      最近更新 更多