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

时间:2016-04-14 05:15:09

标签: shell ksh

#!/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如何处理它。

1 个答案:

答案 0 :(得分:2)

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

这不是ksh特有的;这个基本功能一直回到原来的Bourne shell。

来自其他背景的程序员经常遇到Bourne shell语法的词汇性质问题。但它真的很简单;有令牌,而且shell并没有为大多数令牌赋予更多的句法意义。这意味着它的行为可以非常动态 - 一个变量可以是一个命令,一个选项字符串,一个文件名,或几乎任何东西,有时甚至可以是很多这些东西。

在内存内容的特定术语中,$list的值在解析for行时由令牌按令牌复制,因此更改循环内变量的值很简单且没有说明性。 / p>