Yanıtlar:
Görünüşe göre bash, oluşturulan kelimelere katılmak için $ IFS kullanmıyor. Başka bir teknik, oluşturulan kelimeleri bir dizide saklamak ve daha sonra $ IFS oyunda olacaktır :
Alt kabuk kullanacağım, bu yüzden bu kabuğun IFS'sini değiştirmem:
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
Bu, virgülle ayırılan dizgiyi stdout'a yayar. Yakalamak istiyorsanız:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
Eminim bunu başarmanın birçok yolu vardır. İşte bir yöntem:
echo a{b,c,d} | sed 's/ /,/g'
Gösterdiğiniz öğeleri genişletin ve ardından ilk yineleme dışındaki herkese virgül ekleyerek bunların üzerine gelin:
for i in a{b,c,d}; do
u="${u:+$u, }$i"
done
echo "$u"
Sonuç:
ab, ac, ad
Bkz. Bash parametresi ikamesi .
İşte sadece bash bir çözüm.
(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad
Noktalı virgülden önceki bölüm ab ac ad
değişkeni atar IN
ve ikinci bölüm tüm boşlukları virgülle değiştirmek için arama ve değiştirme işlevlerini kullanır. Bunun //
anlamı, sadece ilk değil tüm eşleşmelerdir.
Ad alanınızı kirletmemek için hepsini bir alt kabukta (kapalı parantezler) yapın.
Birçok bağlamda, böyle bir listede bir virgülün kabul edilebilir olduğunu belirtmek gerekir. IF bir arka virgül kabul edilebilir, ikame işlemek için en kolay yolu printf
:
some-command "$(printf %s, a{b,c,d} )"
( some-command
Virgülle ayrılmış bir listede çalışan ve sondaki virgülle ilgilenmeyen bir komut nerede .)
Aslında, sondaki virgülünüz olmasa bile kullanabilirsiniz printf
; sadece beklediğiniz bağımsız değişken sayısını belirtmeniz gerekir, bu da onu çok uzun listeler için daha karmaşık hale getirir:
some-command "$(printf %s,%s,%s a{b,c,d} )"