首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么忽略函数中的赋值?

为什么忽略函数中的赋值?
EN

Stack Overflow用户
提问于 2019-05-28 23:31:40
回答 3查看 51关注 0票数 0

考虑以下代码:

代码语言:javascript
复制
zzz=2

function f()
{
    zzz=4
}

$(f)
echo $zzz

为什么忽略赋值(zzz=4)?我以为我知道$( )是做什么的--它将所有写入标准输出的内容逐字粘贴到使用它的地方。但是为什么这会影响全局变量的赋值呢?

EN

回答 3

Stack Overflow用户

发布于 2019-05-28 23:46:49

为什么你把它叫做subshell呢?

代码语言:javascript
复制
zzz=2
f() { zzz=4; }
$(f)            # assigns COPY of zzz, then goes POOF
echo $zzz
f               # assigns to zzz
echo $zzz

通过在子subshell中运行它,您可以创建一个子环境,该环境将变量赋值,然后蒸发。

票数 3
EN

Stack Overflow用户

发布于 2019-05-28 23:42:37

另一个正确的答案是,$()将创建一个子shell,您将拥有独立于父shell的执行环境。

代码语言:javascript
复制
zzz=2

function f()
{
   echo zzz=4
}

eval $(f)
echo $zzz

您可以通过使用eval来解决此问题。首先在函数内部打印所需的赋值语句,然后在调用者代码中计算该语句。

注意:请注意,eval有一些警告,应该避免,除非您确定您的代码的行为。

票数 1
EN

Stack Overflow用户

发布于 2019-05-29 03:20:09

移除f周围的子壳。

假设您确实没有用到子should,代码应该如下所示:

代码语言:javascript
复制
zzz=2

function f()
{
    zzz=4
}

f
echo $zzz

您告诉它函数f需要在不同的shell中执行,所以它不会更改变量。

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

https://stackoverflow.com/questions/56345587

复制
相关文章

相似问题

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