shell 脚本中的列表变量发生了什么

What happen to the list variable in shell script

#!/bin/ksh
list="one two three"
for var in $list ; do
    echo $var
    # Note: Changing this does NOT affect the loop items
    list="nolist"
done

我知道变量 $list 在程序开始之前只被读取一次,所以如果我在循环内更改它,它不会影响 for 循环 运行 但实际发生在内存级别。 $list 是如何创建和销毁的,或者 ksh 实际上是如何处理它的。

list 只是一个字符串。在没有引号的情况下对其进行插值会导致 shell 执行标记拆分和通配符插值;所以字符串变成了标记列表,for 循环循环遍历,依次将循环变量绑定到每个标记。

这不是特定于ksh;这个基本功能一直追溯到原始 Bourne shell.

来自其他背景的程序员通常对 Bourne shell 语法的词汇性质有疑问。但这真的很简单;有标记,并且 shell 没有为大多数标记分配更多的句法含义。这意味着它的行为可以是非常动态的——一个变量可以是一个命令,或者一个选项字符串,或者一个文件名,或者任何东西,有时很多这样的东西同时存在。

在具体的内存内容上,$list的值是在解析for行的时候一个token一个token复制的,所以在循环内改变变量的值很简单,没有戏剧性.