Назначить локальную переменную из функции в linux bash новое значение

У меня есть linux bash script с функцией:

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

Когда я хочу дать переменной LOCAL MYVAR1 в функции myfunctiona новое значение, мне нужно написать

local MYVAR1=$MYVAR1$MYVAR2

или я могу написать

MYVAR1=$MYVAR1$MYVAR2

Во второй строке без "local" я создаю глобальную переменную с тем же именем?

Ответ 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

НТН

Ответ 2

Правильный способ сделать это:

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

Скобки обычно используются, когда вы объединяете переменные. Использовать кавычки.

Переменная все еще локальна, поскольку вы переназначили ее значение в пределах области действия функции. Пример:

#!/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";   

Даже это работает для конкатенации