【问题标题】:Bash replace ls with for loopBash 用 for 循环替换 ls
【发布时间】:2013-04-30 08:44:44
【问题描述】:

有人提示我在 Bash 脚本中使用 file globbing 代替 ls,在我的代码中,我按照说明操作并将 array=($(ls)) 替换为:

function list_files() { for f in *; do [[ -e $f ]] || continue done }
array=($(list_files))

但是新函数没有返回任何东西,我在这里做错了吗?

【问题讨论】:

  • $(function) 被函数打印到标准输出的内容替换。您的函数不打印任何内容。
  • 一旦你解决了这个问题,它并不能解决你的问题。解析list_files 函数的输出与解析ls 的输出有同样的问题。如果文件名包含空格,则在分配给数组时将被视为两个名称。你需要在for 循环中做任何你想做的事情。在该页面上的示例中,有一个 ...,您可以在其中对每个文件执行您想要的操作。
  • 将问题标记为已回答的正确方法是接受其中一个答案,而不是在标题中添加“[已解决]”。
  • @Dan-SimonMyrland,请阅读 chepner 的上述评论。不要在标题中添加“已解决”。
  • 如果问题得到解决,请用已接受的答案打勾/打勾标记对您最有帮助的答案(单击答案旁边的空心对勾标记)。如果您自己找到了答案,请将其添加为答案并尽可能接受。您不做的是“已解决”或与问题标题类似的任何内容。

标签: bash for-loop ls


【解决方案1】:

简单地写下:

array=(*)

撇开你的“list_files”没有输出任何东西,你的方法还有其他问题。

未加引号的命令替换(在您的情况下为“$(list_files)”)仍将受到“分词”和“路径名扩展”(参见 bash(1)“EXPANSION”)的影响,这意味着如果"list_files" 输出,它们将用于将其拆分为数组元素,如果有模式字符,它们将用于尝试将当前目录文件名匹配并替换为单独的数组元素。

OTOH,如果您用双引号引用命令替换,那么整个输出将被视为单个数组元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2011-09-22
    相关资源
    最近更新 更多