web-dev-qa-db-ja.com

文字列からBashの「単語」の配列に移動する

文字列から、各エントリがその文字列の各Wordである配列に移動する必要があります。たとえば、次のように始まります。

VotePedro="Vote for Pedro"

配列が必要です:

Vote
For
Pedro

その後、次のように反復できるはずです:

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done
11
farid99
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
11
airfishey

変数の展開を引用符で囲まないままにした場合。 $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

$IFSで壊す以外に、好きなところで壊すこともできます。

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

...空白で区切られたnullフィールドも可能になります。

0
mikeserv