Bir Dize'den Bash'deki “kelimeler” Dizisine git


11

Her girişte bu dize her kelime olduğu bir dizeye bir dizeden gitmek gerekiyor. Örneğin, aşağıdakilerden başlayarak:

VotePedro="Vote for Pedro"

Diziye ihtiyacım var:

Vote
For
Pedro

Hangi daha sonra üzerinden tekrarlamak mümkün olmalıdır:

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

Yanıtlar:


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

Parantez ve köşeli parantezlerin ne yaptığını açıklayabilir misiniz? BASH'da yeniyim ve bunun neden işe yaradığını anlamak istiyorum.
farid99

1
Diziler genellikle parantez kullanılarak bildirilir. Örneğin votePedroArray=("Vote" "For" "Pedro"), size bir uzunluk 3 dizisi verir. Ve bu bağlamdakiyle ${VotePedro}aynıdır $VotePedro. Tek tek dizi öğelerine erişmek için sorunuzdaki for döngüsü için olana benzer köşeli ayraçlar kullanabilirsiniz. ör ${votePedroArray[0]}. dizideki ilk öğedir (bu örnek için "Oy")
airfishey

Cevabınız için teşekkürler. Oyumu yükseltirdim ama henüz yeterince itibarım yok.
farid99

2
Ve onları tekrarlamak için: $ {votePedroArray [@]} 'da oy vermek için; echo $ oy vermek; bitti
Neil McGill

4

Değişken genişletmeyi ayrılmadan bıraktığınızda, örneğin $VotePedroaşağıdaki adımlar gerçekleştirilir:

  1. Değişkenin değerini arayın.
  2. Boşluğun her bloğundaki değeri bir dize listesine bölün. Daha genel olarak, ayırıcılar IFSdeğişkenin değerindeki karakterlerdir ; varsayılan olarak boşluk, sekme ve yeni satırdır.
  3. Listenin her öğesini bir joker karakter deseni olarak yorumlayın; her öğe için, desen bazı dosyalarla eşleşiyorsa, o öğeyi eşleşen dosya adları listesiyle değiştirin.

Böylece, IFSjoker karakter genişletmeyi kapatarak ve değeri tırnak işaretleri dışında bir dize olan bir değişkeni genişleterek bir dizeyi boşlukla sınırlandırılmış öğelere bölebilirsiniz (varsayılan değerini varsayarak ).

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

Ayrımı doğrudan kullanım noktasında yapabilirsiniz; bu, dizileri olmayan sh gibi kabuklarda bile işe yarar:

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

0

Onu kırmanın yanı sıra $IFS, istediğiniz gibi de kırabilirsiniz:

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

... boşluk bırakılan boş alanlara bile izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.