Bashで文字列を「単語」配列に変換する

Bashで文字列を「単語」配列に変換する

文字列内の各項目は、その文字列の各単語である配列に移動する必要があります。たとえば、次のように起動します。

VotePedro="Vote for Pedro"

配列が必要です。

Vote
For
Pedro

その後、次のように繰り返すことができます。

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done

答え1

VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})

説明する:

配列は通常括弧を使用して宣言されます。たとえば、votePedroArray=("Vote" "For" "Pedro")長さ3の配列があります。${VotePedro}この場合、$ VotePedroと同じです。個々の配列要素にアクセスするには、質問のforループに似た括弧を使用できます。例:${votePedroArray[0]}配列の最初の要素(この場合は「vote」)

答え2

他のほとんどのBourne様シェルでは、bash変数拡張を引用符なしで置くと(たとえば)、次の$VotePedro手順が実行されます。

  1. 変数の値を探します。
  2. 各空のブロックの値を文字列リストに分割します。より一般的には、区切り文字は変数値の文字であり、デフォルトでは空白IFS、タブ、および改行です。
  3. リスト内の各要素を各要素のワイルドカードパターンとして解釈します。パターンが一部のファイルと一致する場合は、その要素を一致するファイル名のリストに置き換えます。

IFSしたがって、ワイルドカード拡張をオフにし、値が引用符の外側の文字列である変数を拡張して、文字列をスペースで区切られた要素(デフォルトは次のように仮定)に分割できます。

VotePedro="Vote for Pedro"
set -f
votePedroArray=($VotePedro)
set +f
for i in "${votePedroArray[@]}"; do …

分割は使用時に簡単です。これは、配列のないshなどのシェルでも機能します。

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
done
set +f

答え3

壊すだけでなく、$IFS好きなところどこでも壊すことができます。

set ''
while case $var in
      (* *) ;; (*)
      ! a=("$var$@")
      esac
do    set '' "${var##* }$@"
      var=${var% "$2"}
done

...空白で区切られた空のフィールドも許可されます。

関連情報