KSH中的变量范围

时间:2012-08-17 06:43:35

标签: shell unix scripting ksh

我编写了一个示例KornShell函数来拆分String,将其放入数组然后打印出值。 代码如下

#!/usr/bin/ksh

splitString() {

    string="abc@hotmail.com;xyz@gmail.com;uvw@yahoo.com"

    oIFS="$IFS"; 
    IFS=';' 
    set -A str $string
    IFS="$oIFS"
}

splitString
echo "strings count = ${#str[@]}"
echo "first : ${str[0]}";
echo "second: ${str[1]}";
echo "third : ${str[2]}";

现在echo没有打印出数组的值,所以我认为它与定义的数组的范围有关。

我是Shell脚本的新手,有人可以帮助我理解上面例子中的变量范围吗?

1 个答案:

答案 0 :(得分:16)

变量的默认范围是整个脚本。

但是,当您在函数内声明变量时,该变量将变为声明它的函数的本地变量。 Ksh有dynamic scoping,因此变量也可以在声明变量的函数调用的函数中访问。这在section on functions in the manual中简明扼要地记录在案。请注意,在AT& T ksh中(与pdksh和派生类相反,以及bash和zsh的类似功能),这仅适用于使用function关键字定义的函数,而不适用于使用传统{{1}定义的函数。 }} 句法。在AT& T ksh93中,在使用传统语法定义的函数中声明的所有变量都是全局的。

声明变量的主要方式是使用f () { … } builtin。它总是使变量成为局部变量(在AT& T ksh中,仅在用typeset声明的函数中)。如果您在未使用function声明变量的情况下分配给变量,那么它就是全局的。

ksh文档没有指定typeset是变量局部变量还是全局变量,不同的版本也是如此。在ksh 93u,pdksh或mksh下,变量是全局的,您的脚本会打印出值。您似乎拥有ksh88或旧版本的ksh,其范围是本地的。我认为在函数外部初始化set -A会创建一个全局变量,但我不确定。

请注意,您应该使用局部变量来覆盖str的值:保存到另一个变量不仅笨拙,而且还很脆弱,因为如果它未被设置则无法正确恢复IFS 。此外,你应该关闭globbing,否则如果字符串包含shell globbing字符IFS,并且其中一个字符恰好与系统上的一个或多个文件匹配,那么它将被展开,例如其中?*\[set -A $string的{​​{1}}将导致string包含当前目录中的文件名列表。

a;*
相关问题