gpt4 book ai didi

shell - KSH 中的变量范围

转载 作者:行者123 更新时间:2023-12-04 03:01:38 25 4
gpt4 key购买 nike

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

#!/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 脚本的新手,有人可以帮助我理解上面示例中变量的范围吗?

最佳答案

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

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

声明变量的主要方式是使用 typeset builtin .它总是使变量成为局部变量(在 AT&T ksh 中,仅在用 function 声明的函数中)。如果在未使用 typeset 声明变量的情况下赋值给它,它是全局性的。

ksh 文档没有指定是否 set -A使变量成为局部或全局变量,并且不同的版本也使之成为可能。在 ksh 93u、pdksh 或 mksh 下,该变量是全局的,并且您的脚本会打印出该值。您似乎拥有 ksh88 或更旧版本的 ksh,其中范围是本地的。我认为初始化 str在函数之外会创建一个全局变量,但我不确定。

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

set -A str
function splitString {
typeset IFS=';' globbing=1
case $- in *f*) globbing=;; esac
set -f
set -A str $string
if [ -n "$globbing" ]; then set +f; fi
}
splitString "$string"

关于shell - KSH 中的变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12000949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com