Bir diziyi bash'ta yeni bir satırda dizinin her bir öğesi ile bir dosyaya yazdırma


13

Dosyada yeni bir satırda dizinin her öğesi ile bir dosyaya bir dizinin içeriğini deniyorum.

IFS=$'\n'   
echo "${mtches[@]}" > sample1.txt 


Mtches içeriği "qwe" ve "asd" dir. Ancak sample1.txtdosya qwe asdtek bir satırda bulunur. Neden IFS değerini resme almıyor?

Yanıtlar:


17

Şunun yerine kullanmalısınızprintfecho :

printf "%s\n" "${mtches[@]}"

Boşsa mtches, yine de bir boş satır çıkacaktır. Bunu hesaba katmak için:

{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file

In bash(ve aynı zamanda POSIX kabukları), sık kullandığınız Konumsal parametreler dizisi olarak "$@"yerine "$*"özel bir nedeniniz yoksa,. İnsan bashından düzenli dizileri destekleyen kabuklarda da bu geçerlidir - bölüm Diziler :

Bir dizinin herhangi bir öğesine $ {name [Subscript]} kullanılarak başvurulabilir. Kabukların dosya adı genişletme işleçleriyle çakışmaları önlemek için parantezler gereklidir. Alt simge '@' veya '*' ise, kelime dizi adının tüm üyelerine genişler. Bu abonelikler yalnızca kelime çift tırnak içinde göründüğünde farklılık gösterir. Sözcük çift tırnak içine alınmışsa, $ {name [*]} her dizi üyesinin değeri IFS değişkeninin ilk karakteri ile ayrılmış tek bir kelimeye genişler ve $ {name [@]} adın her bir öğesini genişletir ayrı bir kelimeye. Dizi üyesi olmadığında, $ {name [@]} hiçbir şeye genişlemez. Çift tırnaklı genişleme bir sözcük içinde gerçekleşirse, ilk parametrenin genişlemesi orijinal sözcüğün başlangıç ​​kısmı ile birleştirilir ve son parametrenin genişlemesi orijinal sözcüğün son kısmı ile birleştirilir.

Yalnızca "${array[*]}"tüm dizi öğelerini bir dizeye birleştirmek istediğinizde kullanın .


Bu nasıl bir fark yaratır?
Ashwin


7

Bunun ${mtches[*]}yerine kullanmak istiyorsunuz .

Kullandığınızda "${mtches[@]}", değerinin ne olduğu önemli değildir $IFS, bash diziyi birden çok bağımsız değişkene böler. İstediğiniz her bir dizi öğesinin katıldığı tek bir argüman \n. ${mtches[*]}bunu başarır.

Ayrıca geçici bir ayar yöntemi olarak $IFSşunları yapabilirsiniz:

( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )

O zaman geri koymakla uğraşmak zorunda kalmazsınız.


pubs.opengroup.org/onlinepubs/9699919799/utilities/… <- POSIX referansı (bu yalnızca bash için geçerli değildir).
Mat

Veya kullanın printf...
jasonwryan

2

Kullanımı için :

for each in "${alpha[@]}"
do
  echo "$each"
done

Kullanımı tarihini ; değerleriniz şunları içeriyorsa bunun başarısız olacağını unutmayın !:

history -p "${alpha[@]}"

Basename kullanma ; değerleriniz şunları içeriyorsa bunun başarısız olacağını unutmayın /:

basename -a "${alpha[@]}"

Shuf kullanma ; sonuçların sırayla çıkmayabileceğini unutmayın:

shuf -e "${alpha[@]}"

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.