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复制的,所以在循环内改变变量的值很简单,没有戏剧性.
#!/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复制的,所以在循环内改变变量的值很简单,没有戏剧性.