How to use a variable as part of an array name
Clash Royale CLAN TAG#URR8PPP
up vote
9
down vote
favorite
I have two arrays:
arrayA=(1 2 3)
arrayB=(a b c)
and I want to print out one of them using a command line argument, i.e., without any if else
.
I tried a few variations on the syntax with no success. I am wanting to do something like this:
ARG="$1"
echo $array$ARG[@]
but I get a "bad substitution" error. How can I achieve this?
bash shell
add a comment |Â
up vote
9
down vote
favorite
I have two arrays:
arrayA=(1 2 3)
arrayB=(a b c)
and I want to print out one of them using a command line argument, i.e., without any if else
.
I tried a few variations on the syntax with no success. I am wanting to do something like this:
ARG="$1"
echo $array$ARG[@]
but I get a "bad substitution" error. How can I achieve this?
bash shell
This is emphatically not idiomatic bash. Please, don't do this.
â Wildcard
Nov 21 '17 at 6:10
add a comment |Â
up vote
9
down vote
favorite
up vote
9
down vote
favorite
I have two arrays:
arrayA=(1 2 3)
arrayB=(a b c)
and I want to print out one of them using a command line argument, i.e., without any if else
.
I tried a few variations on the syntax with no success. I am wanting to do something like this:
ARG="$1"
echo $array$ARG[@]
but I get a "bad substitution" error. How can I achieve this?
bash shell
I have two arrays:
arrayA=(1 2 3)
arrayB=(a b c)
and I want to print out one of them using a command line argument, i.e., without any if else
.
I tried a few variations on the syntax with no success. I am wanting to do something like this:
ARG="$1"
echo $array$ARG[@]
but I get a "bad substitution" error. How can I achieve this?
bash shell
asked Jan 7 '13 at 22:28
Aaron
4424714
4424714
This is emphatically not idiomatic bash. Please, don't do this.
â Wildcard
Nov 21 '17 at 6:10
add a comment |Â
This is emphatically not idiomatic bash. Please, don't do this.
â Wildcard
Nov 21 '17 at 6:10
This is emphatically not idiomatic bash. Please, don't do this.
â Wildcard
Nov 21 '17 at 6:10
This is emphatically not idiomatic bash. Please, don't do this.
â Wildcard
Nov 21 '17 at 6:10
add a comment |Â
7 Answers
7
active
oldest
votes
up vote
15
down vote
accepted
Try doing this :
$ arrayA=(1 2 3)
$ x=A
$ var=array$x[@]
$ echo $!var
1 2 3
NOTE
- from
man bash
(parameter expansion) :
$parameter
The value of parameter is substituted.
The braces are required when parameter is a positional parameter with
more than one
digit, or when parameter is followed by a character which
is not to be interpreted as part of its name.
* If the first character of parameter is an exclamation point (!), a level of variable indirection is introduced. Bash uses the
value of the variable formed from the rest of parameter as the
name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value
of parameter itself. This is known as indirect expansion.
* The exceptions to this are the expansions of $!prefix* and $!name[@] described below. The exclamation point must immediately
follow the left brace in order to introduce indirection.
What exactly is the!
doing in front of thevar
variable? How does that work, it seemed to be history substitution on googling, but I couldn't see how that worked here.
â Aaron
Jan 7 '13 at 22:44
See my edited post
â Gilles Quenot
Jan 7 '13 at 22:53
add a comment |Â
up vote
3
down vote
While you can use the indirect access as pointed in another answer, another way (in ksh and Bash 4.3 and newer) would be to use namerefs. Especially in the case of arrays this may be more useful since you can index the array through the nameref and don't need to put the index in the variable used as the reference.
arr1=(a b c)
arr2=(x y z)
typeset -n p=arr1 # or 'declare -n'
echo "$p[1]" # prints 'b'
This doesn't work through the indirect access:
q=arr2
echo "$!q" # prints 'x', the same as $arr2
echo "$!q[1]" # doesn't work, it tries to take q[1] as a reference
As a C programmer might put it, $!q[1]
here acts as if q
was an array of pointers, instead of being a pointer to an array.
1
This works onlyâ in bash version âÂÂ¥ 4.3.
â G-Man
Dec 24 '17 at 16:10
add a comment |Â
up vote
1
down vote
arrayA=(1 2 3)
arrayB=(a b c)
ARG="$1"
eval echo $array$ARG[@]
dataget ()
eval echo $array$1[$2:-@]
$ dataget A
1 2 3
$ dataget A 0
1
$ dataget B 1
b
note:
escap cotes in case of space!
eval dostuff "$array$1[$2:-@]"
add a comment |Â
up vote
1
down vote
This took a lot of trial and error but eventually worked.
I took some inspiration from Youness. But all other answers did not help on my old bash (suse11sp1[3.2.51(1)-release])
The 'for' loop refused to expand the indirect array, instead you need to pre-expand it, use that to create another array with your new variable name. My example below shows a double loop, as that is my intended use.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
TheNewVariable=$(eval echo $$j#New_things[@])
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
I'm using # to delete the "New_" from the first array entry, then concatenating with "things", to get "FOOthings".
$ with echo and eval, then do their thing in order without throwing errors, which is wrapped in a new $() and assigned the new variable name.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
UPDATE ##### 2018/06/07
I've recently discovered one more spin on this issue. The variable created is not actually an array, but a space delimited string.
For the task above this was ok, because of how "for" works, it doesn't read the array, it is expanded and then looped through, see extract below:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
But, I then needed to use it as an array. For this I needed to perform one more step. I took code verbatim by Dennis Williamson. I've tested it and it works fine.
IFS=', ' read -r -a TheNewVariable <<< $TheNewVariable[@]
The "IFS=', '" is a variable containing your deliminator. "read" with "-a" cuts and feeds the sting back into the array variable. Note, this has no respect for quotation marks, but there are a few options in read to manage this, e.g. I've removed the -r flag which I didn't need.
So I have now combined this addition in the variable creation, which allows the data to be treated and addressed as it should.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
IFS=', ' read -a TheNewVariable <<< $(eval echo $$j#New_things[@])
for i in $TheNewVariable[@] #Now have to wrap with and expand with @
do
echo $j $i" hello"
echo $TheNewVariable[$i] #This would not work in the original code
echo
done
done
add a comment |Â
up vote
-1
down vote
no way :(
if your arrays are that simple, then use associative arrays
declare -A array
array[A]="1 2 3"
array[B]="a b c"
unfortunately, if your arrays are more complicated ( for example array=( "a b" c )
), that wouldn't work. Then, you need to think harder about another way to reach your goal.
What is the reason for the downvote? The associative array provides a nice way of grouping everything, assuming that my elements will all contain no space.
â Aaron
Jan 7 '13 at 23:45
2
@Aaron Assuming your elements don't contain spaces, that is a reasonable design. ï¼ watael I guess beginning the answer with âÂÂno wayâ when the primary focus of your question is clearly possible wasn't a good idea.
â Gilles
Jan 8 '13 at 0:12
add a comment |Â
up vote
-1
down vote
Use eval
arrayA=(1 2 3)
ARG=arrayA
eval echo $$ARG[@] # equivalent to eval echo $arrayA[@]
# note that we escape the first '$' to prevent from
# its parameter expansion before passing it to echo
add a comment |Â
up vote
-1
down vote
This is how you would create a dynamically named variable (bash version < 4.3).
# Dynamically named array
my_variable_name="dyn_arr_names"
eval $my_variable_name=()
# Adding by index to the array eg. dyn_arr_names[0]="bob"
eval $my_variable_name[0]="bob"
# Adding by pushing onto the array eg. dyn_arr_names+=(robert)
eval $my_variable_name+=(robert)
# Print value stored at index indirect
echo $!my_variable_name[0]
# Print value stored at index
eval echo $$my_variable_name[0]
# Get item count
eval echo $#$my_variable_name[@]
Below is a group of functions that can be used to manage dynamically named arrays (bash version < 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
# The following line can be replaced with 'declare -ag $1=()'
# Note: For some reason when using 'declare -ag $1' without the parentheses will make 'declare -p' fail
eval $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$(($#$1[@]))]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval echo $$1[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
local v=$1
eval echo $#$1[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep "a dyn_"
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
Below is a group of functions that can be used to manage dynamically named arrays (bash version >= 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -g -a $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$#r[@]]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $r[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $#r[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep 'a dyn_'
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
For more details on these examples visit Getting Bashed by Dynamic Arrays by Ludvik Jerabek
add a comment |Â
7 Answers
7
active
oldest
votes
7 Answers
7
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
15
down vote
accepted
Try doing this :
$ arrayA=(1 2 3)
$ x=A
$ var=array$x[@]
$ echo $!var
1 2 3
NOTE
- from
man bash
(parameter expansion) :
$parameter
The value of parameter is substituted.
The braces are required when parameter is a positional parameter with
more than one
digit, or when parameter is followed by a character which
is not to be interpreted as part of its name.
* If the first character of parameter is an exclamation point (!), a level of variable indirection is introduced. Bash uses the
value of the variable formed from the rest of parameter as the
name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value
of parameter itself. This is known as indirect expansion.
* The exceptions to this are the expansions of $!prefix* and $!name[@] described below. The exclamation point must immediately
follow the left brace in order to introduce indirection.
What exactly is the!
doing in front of thevar
variable? How does that work, it seemed to be history substitution on googling, but I couldn't see how that worked here.
â Aaron
Jan 7 '13 at 22:44
See my edited post
â Gilles Quenot
Jan 7 '13 at 22:53
add a comment |Â
up vote
15
down vote
accepted
Try doing this :
$ arrayA=(1 2 3)
$ x=A
$ var=array$x[@]
$ echo $!var
1 2 3
NOTE
- from
man bash
(parameter expansion) :
$parameter
The value of parameter is substituted.
The braces are required when parameter is a positional parameter with
more than one
digit, or when parameter is followed by a character which
is not to be interpreted as part of its name.
* If the first character of parameter is an exclamation point (!), a level of variable indirection is introduced. Bash uses the
value of the variable formed from the rest of parameter as the
name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value
of parameter itself. This is known as indirect expansion.
* The exceptions to this are the expansions of $!prefix* and $!name[@] described below. The exclamation point must immediately
follow the left brace in order to introduce indirection.
What exactly is the!
doing in front of thevar
variable? How does that work, it seemed to be history substitution on googling, but I couldn't see how that worked here.
â Aaron
Jan 7 '13 at 22:44
See my edited post
â Gilles Quenot
Jan 7 '13 at 22:53
add a comment |Â
up vote
15
down vote
accepted
up vote
15
down vote
accepted
Try doing this :
$ arrayA=(1 2 3)
$ x=A
$ var=array$x[@]
$ echo $!var
1 2 3
NOTE
- from
man bash
(parameter expansion) :
$parameter
The value of parameter is substituted.
The braces are required when parameter is a positional parameter with
more than one
digit, or when parameter is followed by a character which
is not to be interpreted as part of its name.
* If the first character of parameter is an exclamation point (!), a level of variable indirection is introduced. Bash uses the
value of the variable formed from the rest of parameter as the
name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value
of parameter itself. This is known as indirect expansion.
* The exceptions to this are the expansions of $!prefix* and $!name[@] described below. The exclamation point must immediately
follow the left brace in order to introduce indirection.
Try doing this :
$ arrayA=(1 2 3)
$ x=A
$ var=array$x[@]
$ echo $!var
1 2 3
NOTE
- from
man bash
(parameter expansion) :
$parameter
The value of parameter is substituted.
The braces are required when parameter is a positional parameter with
more than one
digit, or when parameter is followed by a character which
is not to be interpreted as part of its name.
* If the first character of parameter is an exclamation point (!), a level of variable indirection is introduced. Bash uses the
value of the variable formed from the rest of parameter as the
name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value
of parameter itself. This is known as indirect expansion.
* The exceptions to this are the expansions of $!prefix* and $!name[@] described below. The exclamation point must immediately
follow the left brace in order to introduce indirection.
edited Jan 7 '13 at 22:53
answered Jan 7 '13 at 22:35
Gilles Quenot
15.3k13449
15.3k13449
What exactly is the!
doing in front of thevar
variable? How does that work, it seemed to be history substitution on googling, but I couldn't see how that worked here.
â Aaron
Jan 7 '13 at 22:44
See my edited post
â Gilles Quenot
Jan 7 '13 at 22:53
add a comment |Â
What exactly is the!
doing in front of thevar
variable? How does that work, it seemed to be history substitution on googling, but I couldn't see how that worked here.
â Aaron
Jan 7 '13 at 22:44
See my edited post
â Gilles Quenot
Jan 7 '13 at 22:53
What exactly is the
!
doing in front of the var
variable? How does that work, it seemed to be history substitution on googling, but I couldn't see how that worked here.â Aaron
Jan 7 '13 at 22:44
What exactly is the
!
doing in front of the var
variable? How does that work, it seemed to be history substitution on googling, but I couldn't see how that worked here.â Aaron
Jan 7 '13 at 22:44
See my edited post
â Gilles Quenot
Jan 7 '13 at 22:53
See my edited post
â Gilles Quenot
Jan 7 '13 at 22:53
add a comment |Â
up vote
3
down vote
While you can use the indirect access as pointed in another answer, another way (in ksh and Bash 4.3 and newer) would be to use namerefs. Especially in the case of arrays this may be more useful since you can index the array through the nameref and don't need to put the index in the variable used as the reference.
arr1=(a b c)
arr2=(x y z)
typeset -n p=arr1 # or 'declare -n'
echo "$p[1]" # prints 'b'
This doesn't work through the indirect access:
q=arr2
echo "$!q" # prints 'x', the same as $arr2
echo "$!q[1]" # doesn't work, it tries to take q[1] as a reference
As a C programmer might put it, $!q[1]
here acts as if q
was an array of pointers, instead of being a pointer to an array.
1
This works onlyâ in bash version âÂÂ¥ 4.3.
â G-Man
Dec 24 '17 at 16:10
add a comment |Â
up vote
3
down vote
While you can use the indirect access as pointed in another answer, another way (in ksh and Bash 4.3 and newer) would be to use namerefs. Especially in the case of arrays this may be more useful since you can index the array through the nameref and don't need to put the index in the variable used as the reference.
arr1=(a b c)
arr2=(x y z)
typeset -n p=arr1 # or 'declare -n'
echo "$p[1]" # prints 'b'
This doesn't work through the indirect access:
q=arr2
echo "$!q" # prints 'x', the same as $arr2
echo "$!q[1]" # doesn't work, it tries to take q[1] as a reference
As a C programmer might put it, $!q[1]
here acts as if q
was an array of pointers, instead of being a pointer to an array.
1
This works onlyâ in bash version âÂÂ¥ 4.3.
â G-Man
Dec 24 '17 at 16:10
add a comment |Â
up vote
3
down vote
up vote
3
down vote
While you can use the indirect access as pointed in another answer, another way (in ksh and Bash 4.3 and newer) would be to use namerefs. Especially in the case of arrays this may be more useful since you can index the array through the nameref and don't need to put the index in the variable used as the reference.
arr1=(a b c)
arr2=(x y z)
typeset -n p=arr1 # or 'declare -n'
echo "$p[1]" # prints 'b'
This doesn't work through the indirect access:
q=arr2
echo "$!q" # prints 'x', the same as $arr2
echo "$!q[1]" # doesn't work, it tries to take q[1] as a reference
As a C programmer might put it, $!q[1]
here acts as if q
was an array of pointers, instead of being a pointer to an array.
While you can use the indirect access as pointed in another answer, another way (in ksh and Bash 4.3 and newer) would be to use namerefs. Especially in the case of arrays this may be more useful since you can index the array through the nameref and don't need to put the index in the variable used as the reference.
arr1=(a b c)
arr2=(x y z)
typeset -n p=arr1 # or 'declare -n'
echo "$p[1]" # prints 'b'
This doesn't work through the indirect access:
q=arr2
echo "$!q" # prints 'x', the same as $arr2
echo "$!q[1]" # doesn't work, it tries to take q[1] as a reference
As a C programmer might put it, $!q[1]
here acts as if q
was an array of pointers, instead of being a pointer to an array.
edited Dec 24 '17 at 20:59
answered Dec 24 '17 at 13:47
ilkkachu
49.9k674137
49.9k674137
1
This works onlyâ in bash version âÂÂ¥ 4.3.
â G-Man
Dec 24 '17 at 16:10
add a comment |Â
1
This works onlyâ in bash version âÂÂ¥ 4.3.
â G-Man
Dec 24 '17 at 16:10
1
1
This works onlyâ in bash version âÂÂ¥ 4.3.
â G-Man
Dec 24 '17 at 16:10
This works onlyâ in bash version âÂÂ¥ 4.3.
â G-Man
Dec 24 '17 at 16:10
add a comment |Â
up vote
1
down vote
arrayA=(1 2 3)
arrayB=(a b c)
ARG="$1"
eval echo $array$ARG[@]
dataget ()
eval echo $array$1[$2:-@]
$ dataget A
1 2 3
$ dataget A 0
1
$ dataget B 1
b
note:
escap cotes in case of space!
eval dostuff "$array$1[$2:-@]"
add a comment |Â
up vote
1
down vote
arrayA=(1 2 3)
arrayB=(a b c)
ARG="$1"
eval echo $array$ARG[@]
dataget ()
eval echo $array$1[$2:-@]
$ dataget A
1 2 3
$ dataget A 0
1
$ dataget B 1
b
note:
escap cotes in case of space!
eval dostuff "$array$1[$2:-@]"
add a comment |Â
up vote
1
down vote
up vote
1
down vote
arrayA=(1 2 3)
arrayB=(a b c)
ARG="$1"
eval echo $array$ARG[@]
dataget ()
eval echo $array$1[$2:-@]
$ dataget A
1 2 3
$ dataget A 0
1
$ dataget B 1
b
note:
escap cotes in case of space!
eval dostuff "$array$1[$2:-@]"
arrayA=(1 2 3)
arrayB=(a b c)
ARG="$1"
eval echo $array$ARG[@]
dataget ()
eval echo $array$1[$2:-@]
$ dataget A
1 2 3
$ dataget A 0
1
$ dataget B 1
b
note:
escap cotes in case of space!
eval dostuff "$array$1[$2:-@]"
answered Dec 24 '17 at 22:55
Jonas
873415
873415
add a comment |Â
add a comment |Â
up vote
1
down vote
This took a lot of trial and error but eventually worked.
I took some inspiration from Youness. But all other answers did not help on my old bash (suse11sp1[3.2.51(1)-release])
The 'for' loop refused to expand the indirect array, instead you need to pre-expand it, use that to create another array with your new variable name. My example below shows a double loop, as that is my intended use.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
TheNewVariable=$(eval echo $$j#New_things[@])
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
I'm using # to delete the "New_" from the first array entry, then concatenating with "things", to get "FOOthings".
$ with echo and eval, then do their thing in order without throwing errors, which is wrapped in a new $() and assigned the new variable name.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
UPDATE ##### 2018/06/07
I've recently discovered one more spin on this issue. The variable created is not actually an array, but a space delimited string.
For the task above this was ok, because of how "for" works, it doesn't read the array, it is expanded and then looped through, see extract below:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
But, I then needed to use it as an array. For this I needed to perform one more step. I took code verbatim by Dennis Williamson. I've tested it and it works fine.
IFS=', ' read -r -a TheNewVariable <<< $TheNewVariable[@]
The "IFS=', '" is a variable containing your deliminator. "read" with "-a" cuts and feeds the sting back into the array variable. Note, this has no respect for quotation marks, but there are a few options in read to manage this, e.g. I've removed the -r flag which I didn't need.
So I have now combined this addition in the variable creation, which allows the data to be treated and addressed as it should.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
IFS=', ' read -a TheNewVariable <<< $(eval echo $$j#New_things[@])
for i in $TheNewVariable[@] #Now have to wrap with and expand with @
do
echo $j $i" hello"
echo $TheNewVariable[$i] #This would not work in the original code
echo
done
done
add a comment |Â
up vote
1
down vote
This took a lot of trial and error but eventually worked.
I took some inspiration from Youness. But all other answers did not help on my old bash (suse11sp1[3.2.51(1)-release])
The 'for' loop refused to expand the indirect array, instead you need to pre-expand it, use that to create another array with your new variable name. My example below shows a double loop, as that is my intended use.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
TheNewVariable=$(eval echo $$j#New_things[@])
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
I'm using # to delete the "New_" from the first array entry, then concatenating with "things", to get "FOOthings".
$ with echo and eval, then do their thing in order without throwing errors, which is wrapped in a new $() and assigned the new variable name.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
UPDATE ##### 2018/06/07
I've recently discovered one more spin on this issue. The variable created is not actually an array, but a space delimited string.
For the task above this was ok, because of how "for" works, it doesn't read the array, it is expanded and then looped through, see extract below:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
But, I then needed to use it as an array. For this I needed to perform one more step. I took code verbatim by Dennis Williamson. I've tested it and it works fine.
IFS=', ' read -r -a TheNewVariable <<< $TheNewVariable[@]
The "IFS=', '" is a variable containing your deliminator. "read" with "-a" cuts and feeds the sting back into the array variable. Note, this has no respect for quotation marks, but there are a few options in read to manage this, e.g. I've removed the -r flag which I didn't need.
So I have now combined this addition in the variable creation, which allows the data to be treated and addressed as it should.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
IFS=', ' read -a TheNewVariable <<< $(eval echo $$j#New_things[@])
for i in $TheNewVariable[@] #Now have to wrap with and expand with @
do
echo $j $i" hello"
echo $TheNewVariable[$i] #This would not work in the original code
echo
done
done
add a comment |Â
up vote
1
down vote
up vote
1
down vote
This took a lot of trial and error but eventually worked.
I took some inspiration from Youness. But all other answers did not help on my old bash (suse11sp1[3.2.51(1)-release])
The 'for' loop refused to expand the indirect array, instead you need to pre-expand it, use that to create another array with your new variable name. My example below shows a double loop, as that is my intended use.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
TheNewVariable=$(eval echo $$j#New_things[@])
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
I'm using # to delete the "New_" from the first array entry, then concatenating with "things", to get "FOOthings".
$ with echo and eval, then do their thing in order without throwing errors, which is wrapped in a new $() and assigned the new variable name.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
UPDATE ##### 2018/06/07
I've recently discovered one more spin on this issue. The variable created is not actually an array, but a space delimited string.
For the task above this was ok, because of how "for" works, it doesn't read the array, it is expanded and then looped through, see extract below:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
But, I then needed to use it as an array. For this I needed to perform one more step. I took code verbatim by Dennis Williamson. I've tested it and it works fine.
IFS=', ' read -r -a TheNewVariable <<< $TheNewVariable[@]
The "IFS=', '" is a variable containing your deliminator. "read" with "-a" cuts and feeds the sting back into the array variable. Note, this has no respect for quotation marks, but there are a few options in read to manage this, e.g. I've removed the -r flag which I didn't need.
So I have now combined this addition in the variable creation, which allows the data to be treated and addressed as it should.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
IFS=', ' read -a TheNewVariable <<< $(eval echo $$j#New_things[@])
for i in $TheNewVariable[@] #Now have to wrap with and expand with @
do
echo $j $i" hello"
echo $TheNewVariable[$i] #This would not work in the original code
echo
done
done
This took a lot of trial and error but eventually worked.
I took some inspiration from Youness. But all other answers did not help on my old bash (suse11sp1[3.2.51(1)-release])
The 'for' loop refused to expand the indirect array, instead you need to pre-expand it, use that to create another array with your new variable name. My example below shows a double loop, as that is my intended use.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
TheNewVariable=$(eval echo $$j#New_things[@])
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
I'm using # to delete the "New_" from the first array entry, then concatenating with "things", to get "FOOthings".
$ with echo and eval, then do their thing in order without throwing errors, which is wrapped in a new $() and assigned the new variable name.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
UPDATE ##### 2018/06/07
I've recently discovered one more spin on this issue. The variable created is not actually an array, but a space delimited string.
For the task above this was ok, because of how "for" works, it doesn't read the array, it is expanded and then looped through, see extract below:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
But, I then needed to use it as an array. For this I needed to perform one more step. I took code verbatim by Dennis Williamson. I've tested it and it works fine.
IFS=', ' read -r -a TheNewVariable <<< $TheNewVariable[@]
The "IFS=', '" is a variable containing your deliminator. "read" with "-a" cuts and feeds the sting back into the array variable. Note, this has no respect for quotation marks, but there are a few options in read to manage this, e.g. I've removed the -r flag which I didn't need.
So I have now combined this addition in the variable creation, which allows the data to be treated and addressed as it should.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in $THEBIGLOOP[*]
do
IFS=', ' read -a TheNewVariable <<< $(eval echo $$j#New_things[@])
for i in $TheNewVariable[@] #Now have to wrap with and expand with @
do
echo $j $i" hello"
echo $TheNewVariable[$i] #This would not work in the original code
echo
done
done
edited Jun 7 at 12:15
answered May 15 at 11:07
Stripy42
112
112
add a comment |Â
add a comment |Â
up vote
-1
down vote
no way :(
if your arrays are that simple, then use associative arrays
declare -A array
array[A]="1 2 3"
array[B]="a b c"
unfortunately, if your arrays are more complicated ( for example array=( "a b" c )
), that wouldn't work. Then, you need to think harder about another way to reach your goal.
What is the reason for the downvote? The associative array provides a nice way of grouping everything, assuming that my elements will all contain no space.
â Aaron
Jan 7 '13 at 23:45
2
@Aaron Assuming your elements don't contain spaces, that is a reasonable design. ï¼ watael I guess beginning the answer with âÂÂno wayâ when the primary focus of your question is clearly possible wasn't a good idea.
â Gilles
Jan 8 '13 at 0:12
add a comment |Â
up vote
-1
down vote
no way :(
if your arrays are that simple, then use associative arrays
declare -A array
array[A]="1 2 3"
array[B]="a b c"
unfortunately, if your arrays are more complicated ( for example array=( "a b" c )
), that wouldn't work. Then, you need to think harder about another way to reach your goal.
What is the reason for the downvote? The associative array provides a nice way of grouping everything, assuming that my elements will all contain no space.
â Aaron
Jan 7 '13 at 23:45
2
@Aaron Assuming your elements don't contain spaces, that is a reasonable design. ï¼ watael I guess beginning the answer with âÂÂno wayâ when the primary focus of your question is clearly possible wasn't a good idea.
â Gilles
Jan 8 '13 at 0:12
add a comment |Â
up vote
-1
down vote
up vote
-1
down vote
no way :(
if your arrays are that simple, then use associative arrays
declare -A array
array[A]="1 2 3"
array[B]="a b c"
unfortunately, if your arrays are more complicated ( for example array=( "a b" c )
), that wouldn't work. Then, you need to think harder about another way to reach your goal.
no way :(
if your arrays are that simple, then use associative arrays
declare -A array
array[A]="1 2 3"
array[B]="a b c"
unfortunately, if your arrays are more complicated ( for example array=( "a b" c )
), that wouldn't work. Then, you need to think harder about another way to reach your goal.
answered Jan 7 '13 at 22:41
watael
69154
69154
What is the reason for the downvote? The associative array provides a nice way of grouping everything, assuming that my elements will all contain no space.
â Aaron
Jan 7 '13 at 23:45
2
@Aaron Assuming your elements don't contain spaces, that is a reasonable design. ï¼ watael I guess beginning the answer with âÂÂno wayâ when the primary focus of your question is clearly possible wasn't a good idea.
â Gilles
Jan 8 '13 at 0:12
add a comment |Â
What is the reason for the downvote? The associative array provides a nice way of grouping everything, assuming that my elements will all contain no space.
â Aaron
Jan 7 '13 at 23:45
2
@Aaron Assuming your elements don't contain spaces, that is a reasonable design. ï¼ watael I guess beginning the answer with âÂÂno wayâ when the primary focus of your question is clearly possible wasn't a good idea.
â Gilles
Jan 8 '13 at 0:12
What is the reason for the downvote? The associative array provides a nice way of grouping everything, assuming that my elements will all contain no space.
â Aaron
Jan 7 '13 at 23:45
What is the reason for the downvote? The associative array provides a nice way of grouping everything, assuming that my elements will all contain no space.
â Aaron
Jan 7 '13 at 23:45
2
2
@Aaron Assuming your elements don't contain spaces, that is a reasonable design. ï¼ watael I guess beginning the answer with âÂÂno wayâ when the primary focus of your question is clearly possible wasn't a good idea.
â Gilles
Jan 8 '13 at 0:12
@Aaron Assuming your elements don't contain spaces, that is a reasonable design. ï¼ watael I guess beginning the answer with âÂÂno wayâ when the primary focus of your question is clearly possible wasn't a good idea.
â Gilles
Jan 8 '13 at 0:12
add a comment |Â
up vote
-1
down vote
Use eval
arrayA=(1 2 3)
ARG=arrayA
eval echo $$ARG[@] # equivalent to eval echo $arrayA[@]
# note that we escape the first '$' to prevent from
# its parameter expansion before passing it to echo
add a comment |Â
up vote
-1
down vote
Use eval
arrayA=(1 2 3)
ARG=arrayA
eval echo $$ARG[@] # equivalent to eval echo $arrayA[@]
# note that we escape the first '$' to prevent from
# its parameter expansion before passing it to echo
add a comment |Â
up vote
-1
down vote
up vote
-1
down vote
Use eval
arrayA=(1 2 3)
ARG=arrayA
eval echo $$ARG[@] # equivalent to eval echo $arrayA[@]
# note that we escape the first '$' to prevent from
# its parameter expansion before passing it to echo
Use eval
arrayA=(1 2 3)
ARG=arrayA
eval echo $$ARG[@] # equivalent to eval echo $arrayA[@]
# note that we escape the first '$' to prevent from
# its parameter expansion before passing it to echo
edited Apr 4 '14 at 18:59
answered Apr 4 '14 at 18:54
MS.Kim
67221116
67221116
add a comment |Â
add a comment |Â
up vote
-1
down vote
This is how you would create a dynamically named variable (bash version < 4.3).
# Dynamically named array
my_variable_name="dyn_arr_names"
eval $my_variable_name=()
# Adding by index to the array eg. dyn_arr_names[0]="bob"
eval $my_variable_name[0]="bob"
# Adding by pushing onto the array eg. dyn_arr_names+=(robert)
eval $my_variable_name+=(robert)
# Print value stored at index indirect
echo $!my_variable_name[0]
# Print value stored at index
eval echo $$my_variable_name[0]
# Get item count
eval echo $#$my_variable_name[@]
Below is a group of functions that can be used to manage dynamically named arrays (bash version < 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
# The following line can be replaced with 'declare -ag $1=()'
# Note: For some reason when using 'declare -ag $1' without the parentheses will make 'declare -p' fail
eval $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$(($#$1[@]))]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval echo $$1[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
local v=$1
eval echo $#$1[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep "a dyn_"
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
Below is a group of functions that can be used to manage dynamically named arrays (bash version >= 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -g -a $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$#r[@]]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $r[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $#r[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep 'a dyn_'
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
For more details on these examples visit Getting Bashed by Dynamic Arrays by Ludvik Jerabek
add a comment |Â
up vote
-1
down vote
This is how you would create a dynamically named variable (bash version < 4.3).
# Dynamically named array
my_variable_name="dyn_arr_names"
eval $my_variable_name=()
# Adding by index to the array eg. dyn_arr_names[0]="bob"
eval $my_variable_name[0]="bob"
# Adding by pushing onto the array eg. dyn_arr_names+=(robert)
eval $my_variable_name+=(robert)
# Print value stored at index indirect
echo $!my_variable_name[0]
# Print value stored at index
eval echo $$my_variable_name[0]
# Get item count
eval echo $#$my_variable_name[@]
Below is a group of functions that can be used to manage dynamically named arrays (bash version < 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
# The following line can be replaced with 'declare -ag $1=()'
# Note: For some reason when using 'declare -ag $1' without the parentheses will make 'declare -p' fail
eval $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$(($#$1[@]))]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval echo $$1[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
local v=$1
eval echo $#$1[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep "a dyn_"
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
Below is a group of functions that can be used to manage dynamically named arrays (bash version >= 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -g -a $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$#r[@]]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $r[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $#r[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep 'a dyn_'
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
For more details on these examples visit Getting Bashed by Dynamic Arrays by Ludvik Jerabek
add a comment |Â
up vote
-1
down vote
up vote
-1
down vote
This is how you would create a dynamically named variable (bash version < 4.3).
# Dynamically named array
my_variable_name="dyn_arr_names"
eval $my_variable_name=()
# Adding by index to the array eg. dyn_arr_names[0]="bob"
eval $my_variable_name[0]="bob"
# Adding by pushing onto the array eg. dyn_arr_names+=(robert)
eval $my_variable_name+=(robert)
# Print value stored at index indirect
echo $!my_variable_name[0]
# Print value stored at index
eval echo $$my_variable_name[0]
# Get item count
eval echo $#$my_variable_name[@]
Below is a group of functions that can be used to manage dynamically named arrays (bash version < 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
# The following line can be replaced with 'declare -ag $1=()'
# Note: For some reason when using 'declare -ag $1' without the parentheses will make 'declare -p' fail
eval $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$(($#$1[@]))]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval echo $$1[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
local v=$1
eval echo $#$1[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep "a dyn_"
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
Below is a group of functions that can be used to manage dynamically named arrays (bash version >= 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -g -a $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$#r[@]]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $r[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $#r[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep 'a dyn_'
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
For more details on these examples visit Getting Bashed by Dynamic Arrays by Ludvik Jerabek
This is how you would create a dynamically named variable (bash version < 4.3).
# Dynamically named array
my_variable_name="dyn_arr_names"
eval $my_variable_name=()
# Adding by index to the array eg. dyn_arr_names[0]="bob"
eval $my_variable_name[0]="bob"
# Adding by pushing onto the array eg. dyn_arr_names+=(robert)
eval $my_variable_name+=(robert)
# Print value stored at index indirect
echo $!my_variable_name[0]
# Print value stored at index
eval echo $$my_variable_name[0]
# Get item count
eval echo $#$my_variable_name[@]
Below is a group of functions that can be used to manage dynamically named arrays (bash version < 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
# The following line can be replaced with 'declare -ag $1=()'
# Note: For some reason when using 'declare -ag $1' without the parentheses will make 'declare -p' fail
eval $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$(($#$1[@]))]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval $1[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
eval echo $$1[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
local v=$1
eval echo $#$1[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep "a dyn_"
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
Below is a group of functions that can be used to manage dynamically named arrays (bash version >= 4.3).
# Dynamically create an array by name
function arr()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -g -a $1=()
# Insert incrementing by incrementing index eg. array+=(data)
function arr_insert()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$#r[@]]=$2
# Update an index by position
function arr_set()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
r[$2]=$3
# Get the array content $array[@]
function arr_get()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $r[@]
# Get the value stored at a specific index eg. $array[0]
function arr_at()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable" 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
[[ ! "$2" =~ ^(0
# Get the value stored at a specific index eg. $array[0]
function arr_count()
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && echo "Invalid bash variable " 1>&2 ; return 1 ;
declare -p "$1" > /dev/null 2>&1
[[ $? -eq 1 ]] && echo "Bash variable [$1] doesn't exist" 1>&2 ; return 1 ;
declare -n r=$1
echo $#r[@]
array_names=(bob jane dick)
for name in "$array_names[@]"
do
arr dyn_$name
done
echo "Arrays Created"
declare -a | grep "a dyn_"
# Insert three items per array
for name in "$array_names[@]"
do
echo "Inserting dyn_$name abc"
arr_insert dyn_$name "abc"
echo "Inserting dyn_$name def"
arr_insert dyn_$name "def"
echo "Inserting dyn_$name ghi"
arr_insert dyn_$name "ghi"
done
for name in "$array_names[@]"
do
echo "Setting dyn_$name[0]=first"
arr_set dyn_$name 0 "first"
echo "Setting dyn_$name[2]=third"
arr_set dyn_$name 2 "third"
done
declare -a | grep 'a dyn_'
for name in "$array_names[@]"
do
arr_get dyn_$name
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name by index"
# Print by index
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ ))
do
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)"
done
done
for name in "$array_names[@]"
do
echo "Dumping dyn_$name"
for n in $(arr_get dyn_$name)
do
echo $n
done
done
For more details on these examples visit Getting Bashed by Dynamic Arrays by Ludvik Jerabek
edited Aug 26 '15 at 3:07
answered Aug 25 '15 at 1:24
NOPx90
11
11
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f60584%2fhow-to-use-a-variable-as-part-of-an-array-name%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
This is emphatically not idiomatic bash. Please, don't do this.
â Wildcard
Nov 21 '17 at 6:10