14

I am trying to create a dynamic variable and assign 100 to it

#!/bin/bash
.
.   
active_id=$p_val 
flag_$active_id=100

But I am getting error in doing so, any help ?

Yves M.
  • 29,855
  • 23
  • 108
  • 144
Shivam Agrawal
  • 2,053
  • 4
  • 26
  • 42
  • 5
    possible duplicate of [Bash dynamic variable names](http://stackoverflow.com/questions/16553089/bash-dynamic-variable-names) – rkhayrov Aug 02 '13 at 14:06

2 Answers2

24

You can use bash's declare directive and indirection feature like this:

p_val="foo"
active_id=$p_val
declare "flag_$active_id"="100"

TESTING:

> set | grep flag
flag_foo=100

UPDATE:

p_val="foo"
active_id="$p_val"
v="flag_$active_id"
declare "$v"="100"

> echo "$v"
flag_foo
> echo "${!v}"
100

Usage in if condition:

if [ "${!v}" -ne 100 ]; then
   echo "yes"
else
   echo "no"
fi

# prints no
anubhava
  • 761,203
  • 64
  • 569
  • 643
5

I don't know what this should be good for but you can achieve stuff like this with bash's eval statement.

The following code illustrates that.

#!/bin/bash

p_val="TEST"
active_id=$p_val 

eval "flag_$active_id=100"

echo $flag_TEST
eval "echo \$flag_$active_id"

The terminating echo's puts

100
100

on the stdout.

user1146332
  • 2,630
  • 1
  • 15
  • 19
  • Just a friendly word of warning, while this will work, eval is a super dangerous, specially on the shell. so never use in anything that comes from user input. ever. – JAR.JAR.beans Aug 17 '16 at 07:06