局部变量晚改变值

时间:2020-08-07 23:47:32

标签: scope eval zsh local-variables

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

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

这是我运行my-func 123 "echo $v"时获得的输出:

首次运行:

#nothing

第二次运行:

123

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

123

第二次以上:

789

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

1 个答案:

答案 0 :(得分:1)

我不知道是什么使arundeep chohan相信函数结尾处的行以某种方式在前面的行之前运行。那不是正在发生的事情。

这里有两件事要记住:

  • 在传递给函数之前,参数会在命令行 上进行变量扩展;和

  • 在函数内部定义的变量默认情况下是全局范围的,因此它们在创建时将对整个外壳可用,这在执行到达变量所在行的第一次调用函数期间发生被宣布。除非还导出了变量,否则在销毁shell进程或取消设置该变量时,该变量将不复存在。

这是您的函数定义:

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

这是您在问题中所描述的输入命令的顺序;注释,以便在函数接收参数之前洞悉命令行中发生的情况;并将每个输出打印在下面:

$ 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