How to pass array to bash shell script?
Solution 1
AFAIK, you can't. You have to serialize it and deserialize it, e.g. via the argument array:
first
#!/bin/bash
ar=('foo' 'bar' 'baz' 'bat')
second "${ar[@]}" #this is equivalent to: second foo bar baz bat
second
#!/bin/bash
arr=( "$@" )
printf ' ->%s\n' "${arr[@]}"
<<PRINTS
-> foo
-> bar
-> baz
-> bat
PRINTS
A little bit of advice:
- reserve all caps for
export
ed variables - unless you have a very good specific reason for not doing so
"${someArray[@]}"
should always be double quoted; this formula behaves exactly like'array item 0' 'array item 1' 'aray item 2' 'etc.'
(assumingsomeArray=( 'array item 0' 'aray item 1' 'aray item 2' 'etc.' )
)
Solution 2
The AR
array is passed via the first argument to second.sh
.
first.sh
#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "$(printf "(" ; printf "'%s' " "${AR[@]}" ; printf ")")"
Note that sh
is not used anymore to run the second.sh
script.
These chained printf
are used to forge a single parameter that will be safe if some array elements contain space chars.
second.sh
#!/bin/bash
declare -a ARR=$1
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"
----
For a solution where the AR
array is passed using any number of arguments to the second.sh
script.
first.sh
#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "${AR[@]}"
second.sh
#!/bin/bash
ARR=( "$@" )
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"
----
The test:
$ chmod +x *sh
$ ./first.sh
AR array contains 4 elements: foo bar a space bat
ARR array contains 1 elements: foo
ARR array contains 4 elements: foo bar a space bat
Related videos on Youtube
Mowzer
Just here to learn and grow as a coder/developer. I appreciate all the knowledge others share and I try to help out where I can. I am very thankful for your wisdom and grateful that you are willing to share it. I always ACCEPT and UPVOTE answers! Here's proof! My formula for writing questions. State your goal. Describe the behavior you expect to see. Describe what you actually see. List the detailed steps to recreate the problem. (Optional) Describe any solutions you might have tried or areas where you think the problem might be. Ask the actual question itself. (Highlighting optional). Show your code. (Preferably in a demo like jsBin, plunkr, jsFiddle or CodePen.) See this example SO question.
Updated on September 18, 2022Comments
-
Mowzer almost 2 years
How do I pass an array as a variable from a first bash shell script to a second script.
first.sh
second.sh#!/bin/bash AR=('foo' 'bar' 'baz' 'bat') sh second.sh "$AR" # foo sh second.sh "${AR[@]}" # foo
#!/bin/bash ARR=$1 echo ${ARR[@]}
In both cases, the result is
foo
. But the result I want isfoo bar baz bat
.What am I doing wrong and how do I fix it?