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

Jawaban:


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

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.