Bas tarzı dizilere kül nasıl aktarılır?


13

Bir süre önce, şu anda ortamda çalışabilmesi gereken bir bash betiği yazdım ash.

İçinde bashşöyle oldu:

services=( "service1.service"
           "service2.service"                                       
           "service3.service" )  

for service in "${services[@]}"
do
   START $service                   
done

START()
{
   echo "Starting "$1
   systemctl start $1
}

Gerçekte dizide 40'a yakın hizmet var ve bu geçişi mümkün olduğunca acısız ve temiz yapmak istiyorum. Her zaman bashizm kullanıyorlar . Şimdi komut dosyalarını daha taşınabilir hale getirme göreviyle bir tutamdayım.

Taşınabilirlik nedenlerinden dolayı muhtemelen saf bir ashçözüme sahip olmak güzel olurdu . Ama elimde oldukça sağlam olduğum için bir busyboxmiktar taşınabilirliği feda edebilirim. Yalnızca okunabilirlik çok gelişirse, "temiz" komut dosyası da bir metriktir.

Bu durumda taşınabilir ve temiz bir çözüm ne olurdu ?

Yanıtlar:


8

Diziler vardı önce bash, kshve diğer kabuklar, olağan yöntem, elemanların herhangi değildi bir sınırlayıcı almaya oldu (veya herhangi gerekli kaçan en aza indirmek için nadir olan bir), ve tekrarlayın tüm öğeleri içeren bir dize üzerinde ayırıcı ile ayrılmış. Boşluk genellikle en uygun sınırlayıcı seçimdir, çünkü kabuk zaten varsayılan olarak boşlukla "kelimeleri" ayırır (farklı bir şeye bölünmesini istiyorsanız IFS'yi ayarlayabilirsiniz).

Örneğin:

# backslash-escape any non-delimiter whitespace and all other characters that
# have special meaning to the shell, e.g. globs, parenthesis, ampersands, etc.
services='service1.service service2.service service3.service'

for s in $services ; do  # NOTE: do not double-quote $services here.
  START "$s"
done

$servicesgerektiğini DEĞİL biz çünkü burada çift tırnaklı olmak istiyorum kabuk "kelimeleri" bölmek.


3

kül dizileri yoktur. Yaklaşan tek şey konumsal parametrelerdir, böylece

set -- "service1.service" \
       "service2.service" \
       "service3.service"

for service in "$@"
do
   START $service
done

3

Hizmetler listesine yalnızca bir kez başvurmanız gerekiyorsa, burada-doc kullanabilirsiniz:

while IFS= read -r service
do
   START "$service"
done << END
service1.service
service2.service
service3.service
END

Hizmet adlarının listede belirtilmemesi gerektiğini unutmayın (bunun "$service"için iyi bir nedeniniz olmasa da muhtemelen alıntılanmalıdır). Hizmet adlarının girintili olmasını istiyorsanız , sekmelerle adları <<-yerine girin <<ve girinti yapın:

while IFS= read -r service
do
   START "$service"
done <<- END
        service1.service
        service2.service
        service3.service
END
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.