为什么排版在 bash 和 ksh 上使用 inside/out 函数时有不同的结果?
Why does typeset has different results on bash and ksh when used inside/out of a function?
代码:
#test.sh
test_func(){
var1=""
var2=""
echo "var1 before typeset: $var1"
echo "var2 before typeset: $var2"
typeset -l var1=""
typeset -l var2
echo "var1 after typeset: $var1"
echo "var2 after typeset: $var2"
}
test_func ""
var1=""
var2=""
echo "var1 before typeset: $var1"
echo "var2 before typeset: $var2"
typeset -l var1=
typeset -l var2
echo "var1 after typeset: $var1"
echo "var2 after typeset: $var2"
输出使用 bash 输入 SAMPLE_INPUT:
var1 before typeset: SAMPLE_INPUT
var2 before typeset: SAMPLE_INPUT
var1 after typeset: sample_input
var2 after typeset:
var1 before typeset: SAMPLE_INPUT
var2 before typeset: SAMPLE_INPUT
var1 after typeset: sample_input
var2 after typeset: SAMPLE_INPUT
使用 ksh 输出:
var1 before typeset: SAMPLE_INPUT
var2 before typeset: SAMPLE_INPUT
var1 after typeset: sample_input
var2 after typeset: sample_input
var1 before typeset: sample_input
var2 before typeset: sample_input
var1 after typeset: sample_input
var2 after typeset: sample_input
我不明白为什么 bash 会破坏函数中的 var2 以及为什么 ksh 在函数内部更改变量会影响它在函数外部重新获取 $1 的值时的值。我认为这与他们对局部变量和全局变量的实现有关。
我想要的输出在函数的 bash 和 ksh 和 inside/outside 上是相同的:
var before typeset: SAMPLE_INPUT
var after typeset: sample_input
功能失灵:
var before typeset: SAMPLE_INPUT
var after typeset: sample_input
在 bash 中,typeset
是 declare
的别名,除非添加参数 -g
,否则在函数内部调用时,变量将成为局部变量。
在 ksh 中,typeset
具有不同的行为,具体取决于您定义函数的方式:对于 test_func() { ... }
,使用 typeset
创建的变量是全局的; function test_func { ... }
他们是本地人。因为您使用的是 test_func() {
语法,所以在您的 ksh 代码中,typeset
指的是预先存在的全局变量,而不是创建一个局部变量;所以保留原始值。
如果您想要相同的行为,您需要将 typeset
移到函数之外,或者在 shell 为 bash 时添加 -g
;后者可以通过仅在设置 BASH_VERSION
时发出 -g
的参数扩展来完成,如下所示:
test_func(){
var=""
echo "var before typeset: $var"
typeset ${BASH_VERSION+-g} -l var=""
echo "var after typeset: $var"
}
var="SAMPLE_INPUT"
test_func "$var"
echo "var after function: $var"
...正确发出:
var after function: sample_input
...甚至 bash.
至于空值,即使在 ksh 上,如果您更改函数声明语法以使 typeset
默认创建局部变量,您也会得到它:
function test_func {
typeset -l var
var=""
}
test_func "SAMPLE_INPUT"
echo "Result is: <$var>"
...在 ksh 中 运行 时发出,Result is: <>
。
代码:
#test.sh
test_func(){
var1=""
var2=""
echo "var1 before typeset: $var1"
echo "var2 before typeset: $var2"
typeset -l var1=""
typeset -l var2
echo "var1 after typeset: $var1"
echo "var2 after typeset: $var2"
}
test_func ""
var1=""
var2=""
echo "var1 before typeset: $var1"
echo "var2 before typeset: $var2"
typeset -l var1=
typeset -l var2
echo "var1 after typeset: $var1"
echo "var2 after typeset: $var2"
输出使用 bash 输入 SAMPLE_INPUT:
var1 before typeset: SAMPLE_INPUT
var2 before typeset: SAMPLE_INPUT
var1 after typeset: sample_input
var2 after typeset:
var1 before typeset: SAMPLE_INPUT
var2 before typeset: SAMPLE_INPUT
var1 after typeset: sample_input
var2 after typeset: SAMPLE_INPUT
使用 ksh 输出:
var1 before typeset: SAMPLE_INPUT
var2 before typeset: SAMPLE_INPUT
var1 after typeset: sample_input
var2 after typeset: sample_input
var1 before typeset: sample_input
var2 before typeset: sample_input
var1 after typeset: sample_input
var2 after typeset: sample_input
我不明白为什么 bash 会破坏函数中的 var2 以及为什么 ksh 在函数内部更改变量会影响它在函数外部重新获取 $1 的值时的值。我认为这与他们对局部变量和全局变量的实现有关。
我想要的输出在函数的 bash 和 ksh 和 inside/outside 上是相同的:
var before typeset: SAMPLE_INPUT
var after typeset: sample_input
功能失灵:
var before typeset: SAMPLE_INPUT
var after typeset: sample_input
在 bash 中,typeset
是 declare
的别名,除非添加参数 -g
,否则在函数内部调用时,变量将成为局部变量。
在 ksh 中,typeset
具有不同的行为,具体取决于您定义函数的方式:对于 test_func() { ... }
,使用 typeset
创建的变量是全局的; function test_func { ... }
他们是本地人。因为您使用的是 test_func() {
语法,所以在您的 ksh 代码中,typeset
指的是预先存在的全局变量,而不是创建一个局部变量;所以保留原始值。
如果您想要相同的行为,您需要将 typeset
移到函数之外,或者在 shell 为 bash 时添加 -g
;后者可以通过仅在设置 BASH_VERSION
时发出 -g
的参数扩展来完成,如下所示:
test_func(){
var=""
echo "var before typeset: $var"
typeset ${BASH_VERSION+-g} -l var=""
echo "var after typeset: $var"
}
var="SAMPLE_INPUT"
test_func "$var"
echo "var after function: $var"
...正确发出:
var after function: sample_input
...甚至 bash.
至于空值,即使在 ksh 上,如果您更改函数声明语法以使 typeset
默认创建局部变量,您也会得到它:
function test_func {
typeset -l var
var=""
}
test_func "SAMPLE_INPUT"
echo "Result is: <$var>"
...在 ksh 中 运行 时发出,Result is: <>
。