2016-03-28 19 views
0

Kullanıcılarıma komut satırı seçenekleriyle bir ortam değişkeni belirtmelerine izin vererek bir yapılandırma katmanı sağlamaya çalışıyorum. Bu yapılandırma aslında argümanları alan bir sarıcı programı (run.sh) ve daha sonra programımı çağırır (program.sh).Çevrelemeyi Değişken Komut Dosyası Değişkenlerine Dönüştürme

Teklifleri koruyan argümanlarla ilgili bir sorun yaşıyorum, bu da beklenmedik argümanların iletilmesine neden oluyor. İşte

uygulanmasının örneği sunulmuştur:

run.sh

exec `pwd`/program.sh ${CONFIG} "[email protected]" 

program.sh

for var in "[email protected]" 
do 
    echo "$var" 
done 

bir örnek çağırma şu şekilde görünecektir:

$> CONFIG='--foo="bar baz quo" --foo2="bar2 baz2"' ./run.sh hello abc123  
--foo="bar 
baz 
quo" 
--foo2="bar2 
baz2" 
hello 
abc123 

ben umuyordum gibi çıktı: Ben qoutes içinde run.sh içinde sarma $ {CONFIG} denedi, ama bu sadece --foo="bar baz quo" --foo2="bar2 baz2" tek argüman yapar

--foo="bar baz quo" 
--foo2="bar2 baz2" 
hello 
abc123 

. CONFIG'un içindeki tekliflerden kaçınmak da yanlış bir sonuç verir.

program.sh

eval exec `pwd`/program.sh "${CONFIG}" "[email protected]" 

+0

'abc123' nerededir? – cdarke

+0

Çevre, böyle argümanlar iletmenin doğru yolu değildir. – chepner

+0

@cdarke 'abc123' yanlış çizgiyi koydu, bunu yansıtmak için soruyu güncelledi. – Lull3rSkat3r

cevap

0

run.sh

for var      # The 'in "[email protected]"' is not required, it is the default 
do 
    echo "$var" 
done 

Çıktı: çıktınıza abc123 gelmesi gerekiyordu yerinden emin

$ CONFIG='--foo="bar baz quo" --foo2="bar2 baz2"' ./run.sh hello 
--foo=bar baz quo 
--foo2=bar2 baz2 
hello 

Not.

+1

Bu, CONFIG değişkeninin harici kullanıcılardan gelmesiyle risklidir. Bir kez 'CONFIG = '$ (rm program.sh); --foo = "bar baz quo" --foo2 = "bar2 baz2" '' – anubhava

İlgili konular