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


11

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

VotePedro="Vote for Pedro"

配列が必要です:

Vote
For
Pedro

次に私は次のように反復できるはずです:

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

回答:


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

括弧と括弧が何をしているのか説明してもらえますか?私はBASHを初めて使用するので、これが機能する理由を理解したいと思います。
farid99

1
配列は通常、括弧を使用して宣言されます。たとえばvotePedroArray=("Vote" "For" "Pedro")、長さが3の配列が得られます。これ${VotePedro}は、$VotePedroこのコンテキストと同じです。個々の配列要素にアクセスするには、質問のforループで使用したのと同様のブラケットを使用できます。例:${votePedroArray[0]}配列の最初の要素(この例では「Vote」)
airfishey

ご回答有難うございます。私は賛成票を投じますが、まだ十分な評判がありません。
farid99

2
そして、それらを反復するために:$ {votePedroArray [@]}の投票用; $ voteをエコーし​​ます。完了
Neil McGill

4

変数展開を引用符で囲まないままにすると、たとえば$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

0

それを壊すことに加えて$IFS、あなたは好きなものでそれを壊すこともできます:

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.