#!/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在程序启动之前只读取一次,所以如果我在循环内部更改它,它将不会影响循环运行但实际上在内存级别发生了什么。如何创建和销毁$ list或ksh如何处理它。
答案 0 :(得分:2)
list
只是一个字符串。在没有引号的情况下对其进行插值会导致shell执行令牌拆分和通配符插值;所以字符串变成了一个标记列表,for
循环遍历,将循环变量依次绑定到每个标记。
这不是ksh
特有的;这个基本功能一直回到原来的Bourne shell。
来自其他背景的程序员经常遇到Bourne shell语法的词汇性质问题。但它真的很简单;有令牌,而且shell并没有为大多数令牌赋予更多的句法意义。这意味着它的行为可以非常动态 - 一个变量可以是一个命令,一个选项字符串,一个文件名,或几乎任何东西,有时甚至可以是很多这些东西。
在内存内容的特定术语中,$list
的值在解析for
行时由令牌按令牌复制,因此更改循环内变量的值很简单且没有说明性。 / p>