shell脚本中的list变量会发生什么变化

shell脚本中的list变量会发生什么变化,shell,ksh,Shell,Ksh,我知道变量$list在程序启动之前只读取一次,所以如果我在循环内更改它,它不会影响for循环的运行,而是影响内存级别上实际发生的事情。$list是如何创建和销毁的,或者ksh实际是如何处理它的。list只是一个字符串。不带引号的插值会导致shell执行标记拆分和通配符插值;因此,字符串被转换成一个令牌列表,for循环将其循环,将循环变量依次绑定到每个令牌 这不是特定于ksh的;这一基本功能可以追溯到原始的Bourne shell 来自其他背景的程序员通常对Bourne shell语法的词汇性质有

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

list
只是一个字符串。不带引号的插值会导致shell执行标记拆分和通配符插值;因此,字符串被转换成一个令牌列表,for循环将其循环,将循环变量依次绑定到每个令牌

这不是特定于ksh的
;这一基本功能可以追溯到原始的Bourne shell

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


在具体的内存内容方面,当解析
行的时,
$list
的值会被一个标记一个标记地复制,因此在循环中更改变量的值既简单又不夸张。

感谢分享想法。我已经了解了拆分和其他东西,它是如何作为列表处理的,我想知道在内存中为$list赋值后,它是如何处理的loop@pkm:更重要的是,在循环的第一次迭代之前,将
$list
的副本拆分,并对由此生成的单词进行迭代,不管您做了什么,在循环体中产生它们的变量。
#!/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