If inner.sh is
#... echo first echo second echo third And outer.sh is
var=`./inner.sh` # only wants to use "first"... How can var be split by whitespace?
3 Answers
Try this:
var=($(./inner.sh)) # And then test the array with: echo ${var[0]} echo ${var[1]} echo ${var[2]} Output:
first second third Explanation:
- You can make an array in bash by doing
var=(first second third), for example. $(./inner.sh)runs theinner.shscript, which prints outfirst,second, andthirdon separate lines. Since we don't didn't put double quotes around$(...), they get lumped onto the same line, but separated by spaces, so you end up with what it looks like in the previous bullet point.
Don't forget the builtin mapfile. It's definitely the most efficient in your case: If you want to slurp the whole file in an array, the fields of which will be the lines output by ./inner.sh, do
mapfile -t array < <(./inner.sh) Then you'll have the first row in ${array[0]}, etc...
For more info on this builtin and all the possible options:
help mapfile If you just need the first line in a variable called firstline, do
read -r firstline < <(./inner.sh) These are definitely the most efficient ways!
This small benchmark will prove it:
$ time mapfile -t array < <(for i in {0..100000}; do echo "fdjsakfjds$i"; done) real 0m1.514s user 0m1.492s sys 0m0.560s $ time array=( $(for i in {0..100000}; do echo "fdjsakfjds$i"; done) ) real 0m2.045s user 0m1.844s sys 0m0.308s If you only want the first word (with space delimiter) of the first line output by ./inner.sh, the most efficient way is
read firstword _ < <(./inner.sh) 13You're not splitting on whitespaces but rather on newlines. Give this a whirl:
IFS=$' ' var=$(./echo.sh) echo $var | awk '{ print $1 }' unset IFS 3