2016-04-14 33 views
-3

Minetest adlı bir oyun için yapılmış bir mod yüklemesine yardımcı olmak için bir Bash yükleme komut dosyası yazdım. Komut dosyası başarıyla yürütülür ve geçerli klasörü .../minetest_game/mods'a kopyalar. Ancak, kullanıcıların modun yüklü olduğu alt oyunu (klasör) ./install.sh other_subgame çalıştırarak değiştirmesine izin vermek için başka bir seçenek ayarladım. Bu başarıyla çalışır ve mod doğru klasöre yükler. Ancak, komut dosyasının sonunda çıkmak yerine, subStall adlı bir önceki işleve geri döndüm. Sadece ./install'u çalıştırdığımda bunun gerçekleşmeyeceğini unutmayın.Bash Komut Dosyası Geri Dönme Yerine Döngü

substall işlevi yeniden çalıştırıldığında, kullanıcı Ctrl+C numaralı telefonu kullanabilir ve çıkış yapabilir, ancak hala rahatsızlık verebilir ve bazı kullanıcıları şaşırtabilir.

Herhangi bir fikrin var mı? Komut dosyasını görmek isterseniz, here görüntüleyebilirsiniz. Teşekkürler!

cevap

2

Öncelikle hata ayıklama öneri. Bir komut dosyasının ne yaptığını bilmiyorsanız, ona set -x ekleyin. Daha sonra kabuk, çalıştırmadan önce çalışan her komutu basacaktır. (Yapabileceğiniz başka şeyler var ve daha hassas bir şekilde hata ayıklamanın yollarını merak ediyorsunuz ama bu iyi bir ilk adımdır.) Bunu yapmanın, programınızın akışını takip edip neler olup bittiğini görebilmeniz mümkün olurdu.

İkinci olarak, sorunun (veya en azından bir pastebin veya özünden ya da diğer git repo) için yazı bir MCVE içinde eklemeyi deneyin. İnsanların bir dosyayı indirmesini sağlamak genellikle kaşlarını çatırdıyor ve insanların gerçekte sizin sorununuza bakarak zaman harcamasını çok daha az olası hale getiriyor.

Bu, akışı izlemek ve ne olduğunu görmek için bunu yapmanız gerekmediğini söyledi (doğru şekilde izlediğimi varsaydığımı varsayarak). Bu sorun gibi görünüyor

$subgame senaryo geçildi eğer on line kontrol 145 olduğunu ve bu olduysa o zaman hemen midCheck (149 ve midCheck sonunda install çağıran satırı) diyoruz. Bundan sonra subStall işlevine devam edersiniz ve sonunda midChecknumaralı telefonu tekrar olarak adlandırılan 162 satırına vurursunuz.

Sanırım gördüğünüz şey bu. Bu sorunu gidermek (midCheck ifadesini bildirimini veya daha iyisi sadece $subgame numaralı telefonu kontrol ederek ve 152-159 numaralı satırları çalıştırarak ve yalnızca midCheck tek bir yerde arıyorsa) çıktıktan sonra bu sorunu çözmeniz gerekir.

Ek yorumlar olarak. Aynı işlevi birden fazla yerde (çeşitli if koşulları için) çağırmaktan kaçınmak muhtemelen iyi bir fikirdir. Ayrıca, yakaladığınız genel sorunları (kullanılmayan değişkenler ve benzerleri gibi) görmek için komut dosyanızı http://www.shellcheck.net/ aracılığıyla da çalıştırmak isteyebilirsiniz.

0

Bunu yaptığımda, herhangi bir girdinin daha önce verilmediğini saptayarak subQuery adlı yeni bir işlev çalıştıracağından, null="" ayarı yerine if deyimimi ayarlayarak düzeltmeyi başarabildim. Bu benim sorunumu düzeltdi ve senaryo şimdi düzgün çalışıyor.

Temel anlayışımdan, işleri basitleştirmek için, o zaman hiçbir şey yapmayan bir if deyimine sahip olmanın kötü bir fikir olduğunu düşünüyorum.Belirli bir veri aldığında devam eden bir if ifadesine ihtiyacınız varsa, ancak başka veriler alındığında başka bir şey yaparsanız, temel olarak o deyimi boş bırakarak bunu yapmayın. Komut dosyasının bir sonraki bölümünün saklandığı bir işlevi yapın ve if ifadesiyle ona bağlayın.

Yardımlarınız için teşekkürler. Ve yeterince açık bir şey yapmadıysam, lütfen bana bildirin. Henüz bu şeylere alışkın değilim.