【问题标题】:Doubts with for loop in Unix对 Unix 中的 for 循环的怀疑
【发布时间】:2015-06-20 10:00:24
【问题描述】:

对不起,如果它听起来很愚蠢,但我目前正在准备考试以申请工作(行政),我了解了 ,但对 脚本了解不多。我可以看到它在结构上与 非常相似,我对此有很多疑问。

其中一个就是这个循环,它做了什么,为什么输出b*

for var in b*
   echo $var
done

我试过这段代码,终端输出是b*,为什么这段代码会用文字回答我(在这种情况下,b*)还是发生了其他事情?

【问题讨论】:

  • 您显示的代码给出了语法错误。您省略了所有 shell 循环所必需的 do。 PHP 的行为并不特别像 shell。也许你被 $ 前缀愚弄了:在 PHP 中它是变量名的一部分,在 bash 中它是一个一元运算符来给出值。所以$ 不是在 bash 中赋值的左侧使用,而是在 PHP 中(PHP 受 Perl 和 C 的影响比 shell 更多)。

标签: java php python unix php bash shell unix for-loop


【解决方案1】:

shell 脚本中的 for 循环从输入中获取每个空格分隔的字符串,并将其分配给给定的变量,并为每个值运行一次代码。在您的情况下,b* 是输入,$var 是分配的变量。

shell 也会对输入执行扩展。基本上,* 就像文件名任何部分的通配符一样。因此,如果您在当前目录中有以 b 开头的文件,则这些文件将被循环:

$ ls
bean.java bean.class readme.txt
$ for var in b*; do echo $var; done
bean.java
bean.class

但是,如果您没有任何以 b 开头的文件(因此您的模式 b* 不匹配任何内容),则该模式将保持未扩展:

$ rm bean.*
$ ls
readme.txt
$ for var in b*; do echo $var; done
b*

【讨论】:

  • 哦,我明白了,这是有道理的。当终端只用“ b* ”回答我时,我认为它就像 Java 中的字符串值。太感谢了。学习永远都不会太晚。
  • 虽然你应该引用变量; echo "$var" 带双引号。
  • ...而且,由于您正在教授 globbing,因此请使用 echo * 而不是 ls
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
相关资源
最近更新 更多