【问题标题】:Make Variable available outside of function使变量在函数之外可用
【发布时间】:2016-12-20 11:38:48
【问题描述】:

我之前在从一个很有效的文件生成一些变量方面得到了一些帮助。

我现在遇到的问题是这个过程是作为一个函数保存的,而声明是在该函数中。

有没有办法使用在函数外部声明的变量?我只是得到一个空白行返回

getVARS () {

while IFS== read -r name value; do
    if [[ $name == \#* ]] || [[ $name == \-\-* ]]; then
      echo $name" ignored"
    else
      declare -x "$name=$value"
    fi
done < /home/admin/file.dat

unset IFS

}

上面的函数保存在一个单独的脚本中,并以这种方式调用...

. /home/admin/functions

getVARS
echo "$VarA"

【问题讨论】:

  • 您可以尝试在函数之外声明这些变量。这样,它们将在能够分配值的函数范围内,一旦函数完成,这些值又将可见。
  • 您可以在文件中保存/恢复变量,或者使用命名管道。您可以将函数的输出通过管道传输到其他命令。如果您只需要一个值,您也可以返回一个值。
  • 感谢 cmets。我确实需要从文件中读取的所有变量,但理想情况下我希望将它们保留为整洁的函数。我想我可以剥离其中的功能部分,并在需要时将其包含在我的脚本中。
  • 你试过export $name=$value吗?
  • @alnet 谢谢,这行得通

标签: bash function shell variables


【解决方案1】:

问题在于使用 declare

在 man of declare 中你可以阅读:

当在函数中使用时,declare 使每个名称都是本地的,就像 本地命令。

所以如果你想在你的函数之外使用,你可以使用:

eval $name=$value

export $name=$value

【讨论】:

  • 谢谢,这两个选项都有效。我可以问一下使用 eval 或 export 的好处吗?还是没有区别?
  • 不要使用eval。例如name=foovalue='3;echo hi',则执行name is not 3;echo hi; it's 3, and then echo hi`的值。
  • @RichardC 如果您使用导出所有子进程将看到声明的 var
【解决方案2】:

bash 4.2 开始,您可以将-g 选项添加到declare 以使变量成为全局变量而不是局部变量

getVARS () {

  while IFS== read -r name value; do
    if [[ $name == \#* ]] || [[ $name == \-\-* ]]; then
      echo $name" ignored"
    else
      declare -gx "$name=$value"
    fi
  done < /home/admin/file.dat
}

请注意,您不需要取消设置IFS;将赋值放在 read 之前的目的是将更改本地化到该命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多