【问题标题】:How does the bash for-loop know that a variable is a filebash for循环如何知道变量是文件
【发布时间】:2021-09-11 12:07:57
【问题描述】:

我在当前目录中有 3 个文件

t1
t2
t3

命令

for x in t* ; do echo $x ; done

返回

t1
t2
t3

for 循环如何知道 x 是一个文件?

【问题讨论】:

  • for 循环不知道也不关心 x 是什么。
  • 对,它的回声:echo t*
  • 答案是一样的。 shell 在调用 echo 之前扩展 t*。就不能看说明书吗?都写在那里了。
  • 手册在哪里解释?

标签: bash for-loop


【解决方案1】:

这是由于 Bash 的Shell-Expansions,更具体地说是Filename-ExpansionsPattern-Matching。您正在使用匹配“匹配任何字符串,包括空字符串”的* 通配符。因此,当前目录中与t* 匹配的任何文件都将在 for 循环中进行迭代。在这种情况下,它只是 t1、t2 和 t3。

话虽如此,Bash 本身没有“文件”的概念,而是指向文件系统上特定路径的简单字符串,然后可以与其他命令一起使用。您可以在test 命令中测试是否是带有-f 标志的文件。

【讨论】:

  • 请注意,t* 在启动 for 循环时会扩展为匹配文件名列表。也就是说,for x in t* 在循环执行之前扩展为等价于x in t1 t2 t3,因此循环运行了三次,x 设置为“t1”,然后是“t2”,然后是“t3”。但是一旦扩展发生,shell 就不会记住那些是文件名;展开后,“t1”、“t2”和“t2”就外壳而言只是字符串。
【解决方案2】:

for-loop 对文件一无所知。这是由于evaluation of the globs

【讨论】:

  • “Evaluation of the Globs”听起来像是《星球大战》剧集的标题。 :+1:
  • @TasosPapastylianou 其实是一个评价过程en.wikipedia.org/wiki/Evaluation_strategy
  • 就个人而言,我很期待续集:符号归来!
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2014-10-05
  • 1970-01-01
  • 2021-08-09
  • 2017-05-26
相关资源
最近更新 更多