【问题标题】:assign local variable from function in linux bash a new value从 linux bash 中的函数分配局部变量一个新值
【发布时间】:2014-03-20 08:29:32
【问题描述】:

我有一个带有函数的linux bash 脚本:

myfunctiona () 
{
  local MYVAR1="one"
  local MYVAR2="two"
  echo $MYVAR1
  # The line beneath is the line in question!
  local MYVAR1=$MYVAR1$MYVAR2       
}

当我想给函数myfunctiona中的LOCAL变量MYVAR1一个新值时,我必须写吗

local MYVAR1=$MYVAR1$MYVAR2

或者我也可以写

MYVAR1=$MYVAR1$MYVAR2

如果第二行没有“local”,我是否可以创建一个同名的全局变量?

【问题讨论】:

标签: bash function scope global-variables


【解决方案1】:

一旦你定义了一个局部变量,你就可以正常分配它,像这样:

#!/bin/bash

myfunctiona () 
{
  local MYVAR1="one"
  local MYVAR2="two"
  echo $MYVAR1
  # The line beneath is the line in question!
  local MYVAR1=$MYVAR1$MYVAR2    
  MYVAR1="FOO"
  echo $MYVAR1   
}

myfunctiona
echo "global" $MYVAR1

给出输出:

one
FOO
global
  • 如您所见,尝试从全局范围访问变量会返回 null

HTH

【讨论】:

    【解决方案2】:

    正确的做法是:

    MYVAR1="${MYVAR1}${MYVAR2}"
    

    大括号通常用于连接变量。 Use quotes.

    该变量仍然是本地的,因为您在函数范围内重新分配了它的值。 一个例子:

    #!/usr/bin/env bash
    
    _myFunction()
    {
        local var_1="one"
        local var_2="two"
        local -g var_3="three" # The -g switch makes a local variable a global variable
        var_4="four" # This will be global since we didn't mark it as a local variable from the start
    
        var_1="${var_1}${var_2}"
    
        echo "Inside function var_1=${var_1}"
        echo "Inside function var_2=${var_2}"
        echo "Inside function var_3=${var_3}"
        echo "Inside function var_4=${var_4}"
    }
    
    _myFunction
    
    echo "Outside function var_1=${var_1}"
    echo "Outside function var_2=${var_2}"
    echo "Outside function var_3=${var_3}"
    echo "Outside function var_4=${var_4}"
    

    这会导致:

    $ ./script
    Inside function var_1=onetwo
    Inside function var_2=two
    Inside function var_3=three
    Inside function var_4=four
    Outside function var_1=
    Outside function var_2=
    Outside function var_3=three
    Outside function var_4=four
    

    【讨论】:

      【解决方案3】:

      你可以这样给予,但正如 Ube 所说的串联你需要那样给予 -

      MYVAR1="$MYVAR1$MYVAR2";   
      

      即使这也适用于连接

      【讨论】:

      • 你问的是本地和全球的状态
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      相关资源
      最近更新 更多