【问题标题】:local variable changes value late局部变量更改值较晚
【发布时间】:2020-08-07 23:47:32
【问题描述】:

如果我有这样的函数my-func

my-func(){
    v=$1
    eval $2
}

那么这是我运行my-func 123 "echo $v"得到的输出:

第一次运行:

#nothing

第二次以上运行:

123

如果我现在运行my-func 789 "echo $v",那么我第一次得到以下输出:

123

这是第二次以上:

789

那么,为什么输出延迟了一个,我该如何解决呢?

【问题讨论】:

  • "echo $v"首先运行。
  • @arundeepchohan 是的,但为什么呢?我怎样才能让它第二次运行?
  • 你可以简单地在 v =$1 之后回显 $v。
  • @arundeepchohan ?但这不是my-func(见问题顶部)已经对v=$1; eval $2 所做的吗?
  • 请注意,v本地的;默认情况下,函数内部的赋值是全局的。

标签: scope eval zsh local-variables


【解决方案1】:

我不知道是什么让arundeep chohan 相信你的函数末尾的行在某种程度上是在前面的行之前运行的。这不是正在发生的事情。

这里有两件事要记住:

  • 参数在命令行被发送到函数之前进行变量扩展;和

  • 在函数内部定义的变量默认是全局的,因此它们在创建时对整个 shell 都可用,这发生在第一次调用函数时,当执行到达声明变量的行时。除非变量也被导出,否则当 shell 进程被销毁或未设置时,该变量将不复存在。

这是你的函数定义:

my-func(){
    v=$1
    eval $2
}

这是您在问题中描述的输入命令序列; cmets 在函数接收参数之前提供对命令行中发生的情况的洞察;以及每个打印在下面的输出:

$ my-func 123 "echo $v" # my-func 123 "echo "
$ my-func 123 "echo $v" # my-func 123 "echo 123"
123
$ my-func 789 "echo $v" # my-func 123 "echo 123"
123
$ my-func 789 "echo $v" # my-func 123 "echo 789
789

【讨论】:

  • 啊!谢谢你。在$v 解决它之前添加\ (因为现在执行eval 时会发生变量扩展)!
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2016-12-19
相关资源
最近更新 更多