首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在函数内部使用时,排版对bash和ksh有不同的结果?

为什么在函数内部使用时,排版对bash和ksh有不同的结果?
EN

Stack Overflow用户
提问于 2022-01-11 17:05:44
回答 1查看 124关注 0票数 1

代码:

代码语言:javascript
复制
#test.sh
test_func(){
var1="$1"
var2="$1"
echo "var1 before typeset: $var1"
echo "var2 before typeset: $var2"
typeset -l var1="$1"
typeset -l var2
echo "var1 after typeset: $var1"
echo "var2 after typeset: $var2"
}

test_func "$1"

var1="$1"
var2="$1"
echo "var1 before typeset: $var1"
echo "var2 before typeset: $var2"
typeset -l var1=$1
typeset -l var2
echo "var1 after typeset: $var1"
echo "var2 after typeset: $var2"

使用bash和输入SAMPLE_INPUT进行输出:

代码语言:javascript
复制
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的输出:

代码语言:javascript
复制
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以及函数的内部/外部,我想要的输出是相同的:

代码语言:javascript
复制
var before typeset: SAMPLE_INPUT
var after typeset: sample_input

用在功能之外:

代码语言:javascript
复制
var before typeset: SAMPLE_INPUT
var after typeset: sample_input
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-11 17:19:49

在bash中,typesetdeclare的别名,它使变量在函数中调用时成为局部变量,除非添加了参数-g

在ksh中,根据定义函数的方式,typeset有不同的行为:使用typeset创建的test_func() { ... }变量是全局的;对于function test_func { ... },它们是本地的。由于您使用的是test_func() {语法,所以在ksh代码中,typeset引用先前存在的全局变量,而不是创建本地变量;因此保留原始值。

如果您想要相同的行为,您需要将typeset移出函数,或者在shell是bash时添加-g;后者可以通过参数展开来完成,只有在设置了BASH_VERSION时才会发出-g,如下所示:

代码语言:javascript
复制
test_func(){
  var="$1"
  echo "var before typeset: $var"
  typeset ${BASH_VERSION+-g} -l var="$1"
  echo "var after typeset: $var"
}

var="SAMPLE_INPUT"
test_func "$var"
echo "var after function: $var"

...properly发出:

代码语言:javascript
复制
var after function: sample_input

...even on bash.

对于空值,即使在ksh上,如果更改函数声明语法使typeset默认创建局部变量,也会得到这个值:

代码语言:javascript
复制
function test_func {
  typeset -l var
  var="$1"
}

test_func "SAMPLE_INPUT"
echo "Result is: <$var>"

...emits,Result is: <>在ksh中运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70670689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档