我在 bash 教程中遇到了这个例子:
words="foo bar doo"; for x in $words; do ...
我的理解是,在这种情况下words
是使用“字符串和空格”定义的常规变量。作者没有解释(这是一个bash初学者教程)。
我的问题是,bash(或者可能是其他 shell)的功能是什么使这个工作有效:
for x in $words
-我的意思是x
在每次迭代时分配值foo
,bar
和doo
?在哪里可以找到 bash 手册中记录的此功能?一些链接(文档、博客)将不胜感激。
在 bash 术语中,这个结构如何被称为
words="foo bar doo"
它是一个列表(就像 Python 中的那样)吗?
我在这里找到了类似的帖子数组声明:双引号和括号。
谢谢。
答案1
在bash
手册中您可以看到以下内容:
分词
shell扫描参数扩展的结果、命令替换和算术扩展没有出现在双引号内进行分词。 shell 将 的每个字符
IFS
视为分隔符,并将其他扩展的结果拆分为这些字符上的单词。如果IFS
未设置,或者其值恰好是<space><tab><newline>
,默认值,则 忽略先前扩展结果开头和结尾的 、<space>
、 和序列,并且<newline>
IFS
不在开头或结尾的任何字符序列 都用于分隔单词。如果IFS
具有默认值以外的值,则只要空白字符位于IFS
(一个IFS
空白字符) 的值中,单词开头和结尾的空白字符 space 和 tab 序列就会被忽略。IFS
其中的任何非空白字符IFS
以及任何相邻的IFS
空白字符都会分隔字段。空白字符序列IFS
也被视为分隔符。如果 的值为IFS
空,则不会发生分词。
对 的赋值words
只是创建一个包含空格的字符串。问题是你如何使用它。
就你而言,
words="foo bar doo"; for x in $words; do ...
相当于:
for x in foo bar doo; do ...
因此,shell 会将foo
,bar
和拆分doo
为三个单词(因为它们由空格分隔),并且循环for
将为每个单词运行三次,$x
每次都分配相关单词(如 中python
)。例子:
$ words="foo bar doo"; for x in $words; do echo $x; done
foo
bar
doo
$words
如果您在循环中引用了 the for
,它会将其视为包含空格的单个单词,并且不会拆分它们。所以:
words="foo bar doo"; for x in "$words"; do ...
相当于:
for x in "foo bar doo"; do ...
在这种情况下,循环只会运行一次,其中 的值$x
将是"foo bar doo"
字符串。
$ words="foo bar doo"; for x in "$words"; do echo $x; done
foo bar doo