How to extract a particular element from an array in BASH?

You can extract words from a string (which is what the array elements are) using modifiers in the variable expansion: # (remove prefix), ## (remove prefix, greedy), % (remove suffix), and %% (remove suffix, greedy).

$ myarr=('hello big world!' 'how are you' 'where am I')
$ echo "${myarr[0]}"      # Entire first element of the array
hello big world!
$ echo "${myarr[0]##* }"  # To get the last word, remove prefix through the last space
world!
$ echo "${myarr[0]%% *}"  # To get the first word, remove suffix starting with the first space
hello
$ tmp="${myarr[0]#* }"    # The second word is harder; first remove through the first space...
$ echo "${tmp%% *}"       # ...then get the first word of what remains
big
$ tmp="${myarr[0]#* * }"  # The third word (which might not be the last)? remove through the second space...
$ echo "${tmp%% *}"       # ...then the first word again
world!

As you can see, you can get fairly fancy here, but at some point @chepner's suggestion of turning it into an array gets much easier. Also, the formulae I suggest for extracting the second etc word are a bit fragile: if you use my formula to extract the third word of a string that only has two words, the first trim will fail, and it'll wind up printing the first(!) word instead of a blank. Also, if you have two spaces in a row, this will treat it as a zero-length word with a space on each side of it...

BTW, when building the array I consider it a bit cleaner to use +=(newelement) rather than keeping track of the array index explicitly:

myarr=()
while read line, do
    myarr+=("$line")
done < lines.txt

This is one of many ways

set ${myarr[2]}
echo $3

Tags:

Arrays

Bash