Mulai dari String ke Array "kata" di Bash

11

Saya harus beralih dari string ke array di mana setiap entri adalah setiap kata pada string itu. Misalnya, dimulai dengan:

VotePedro="Vote for Pedro"

Saya membutuhkan array:

Vote
For
Pedro

Yang kemudian bisa saya ulangi sebagai:

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

Jawaban:

11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})
airfishey
sumber
Bisakah Anda menjelaskan apa yang kurung dan kurung lakukan? Saya baru mengenal BASH dan ingin mengerti mengapa ini bisa berhasil.
farid99
1
Array biasanya dinyatakan menggunakan tanda kurung. Misalnya votePedroArray=("Vote" "For" "Pedro")akan memberi Anda array panjang 3. Dan ${VotePedro}sama seperti $VotePedrodalam konteks ini. Untuk mengakses elemen array individual, Anda dapat menggunakan tanda kurung yang mirip dengan yang Anda miliki untuk loop for di pertanyaan Anda. mis. ${votePedroArray[0]}adalah elemen pertama dalam array ("Vote" untuk contoh ini)
airfishey
Terima kasih atas jawaban anda. Saya akan menang tetapi saya belum memiliki reputasi yang cukup.
farid99
2
Dan untuk mengulanginya: untuk suara dalam $ {votePedroArray [@]}; lakukan echo $ vote; selesai
Neil McGill
4

Ketika Anda membiarkan ekspansi variabel tanpa tanda kutip, misalnya $VotePedro, langkah-langkah berikut dilakukan:

  1. Cari nilai variabel.
  2. Membagi nilai di setiap blok spasi putih menjadi daftar string. Lebih umum, pemisah adalah karakter dalam nilai IFSvariabel; secara default itu ruang, tab, dan baris baru.
  3. Menafsirkan setiap elemen daftar sebagai pola wildcard; untuk setiap elemen, jika polanya cocok dengan beberapa file, maka ganti elemen itu dengan daftar nama file yang cocok.

Dengan demikian, Anda dapat membagi string menjadi elemen-elemen yang dibatasi-spasi (dengan asumsi nilai default IFS) dengan mematikan ekspansi wildcard dan memperluas variabel yang nilainya string di luar tanda kutip.

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

Anda dapat langsung melakukan pemisahan pada titik penggunaan; ini akan bekerja bahkan pada shell seperti sh yang tidak memiliki array:

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  
done
set +f
Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

Selain memecahnya $IFS, Anda juga bisa memecahnya pada apa pun yang Anda suka:

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

... yang akan memungkinkan spasi kosong memisahkan bidang nol, bahkan

mikeserv
sumber