带有双引号和单词/项目(如列表)的 Shell bash 结构

带有双引号和单词/项目(如列表)的 Shell bash 结构

我在 bash 教程中遇到了这个例子:

words="foo bar doo"; for x in $words; do ...

我的理解是,在这种情况下words是使用“字符串和空格”定义的常规变量。作者没有解释(这是一个bash初学者教程)。

我的问题是,bash(或者可能是其他 shell)的功能是什么使这个工作有效:

for x in $words

-我的意思是x在每次迭代时分配值foo,bardoo?在哪里可以找到 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

相关内容