Wolfgang Adamec
Wolfgang Adamec

Reputation: 8524

assign local variable from function in linux bash a new value

I have a linux bash script with a function:

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

When I want to give the LOCAL variable MYVAR1 in the function myfunctiona a new value, do I have to write

local MYVAR1=$MYVAR1$MYVAR2

or can I also write

MYVAR1=$MYVAR1$MYVAR2

With the second line without "local" do I create a global variable with the same name?

Upvotes: 30

Views: 19275

Answers (3)

Saucier
Saucier

Reputation: 4360

The correct way to do it would be:

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

The braces are usually used when you concatenate variables. Use quotes.

The variable is still local since you reassigned its value within the scope of the function. An example:

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

This results in:

$ ./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

Upvotes: 7

Geoff Williams
Geoff Williams

Reputation: 1420

Once you've defined a local variable you can assign it normally, like this:

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

which gives the output:

one
FOO
global
  • As you can see attempting to access the variable from global scope returns null

HTH

Upvotes: 36

user3004356
user3004356

Reputation: 880

You can give this way, but as Ube said for concatenation you need to give like that -

MYVAR1="$MYVAR1$MYVAR2";   

Even this works for concatenation

Upvotes: -1

Related Questions