変数展開で修飾子を使用して、文字列 (配列要素と同じ) から単語を抽出できます: #
(プレフィックスを削除)、##
(プレフィックスを削除、貪欲)、%
(サフィックスを削除)、および%%
(サフィックスを削除、貪欲)。
$ 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!
ご覧のとおり、ここではかなり凝っていますが、ある時点で @chepner の配列への変換の提案がはるかに簡単になります。また、2 番目の etc 単語を抽出するために私が提案する式は少し壊れやすいです: 私の式を使用して 2 つの単語しかない文字列の 3 番目の単語を抽出すると、最初のトリムは失敗し、空白の代わりに最初の (!) 単語。また、2 つのスペースが連続している場合は、両側にスペースがある長さ 0 の単語として扱われます...
+=(newelement)
ところで、配列を作成するときは、配列インデックスを明示的に追跡するよりも、使用する方が少しきれいだと思います。
myarr=()
while read line, do
myarr+=("$line")
done < lines.txt