Bash, tartışmasız uyarı ve vaka kararları


110

Bash öğreniyorum.

Verilen argümanlar olmadığında bazı mesajlar gösteren basit bir komut dosyası yapmak istiyorum. Ve argüman olarak sayılar verdiğimde, s değere bağlı olarak, şu ya da bu şeyi yapar.

Bash'de yeni başlayanlar için en iyi çevrimiçi kılavuzlar için önerileri de bilmek istiyorum.

Teşekkürler

Yanıtlar:


176
if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 0
fi

case "$1" in
    1) echo 'you gave 1' ;;
    *) echo 'you gave something else' ;;
esac

Gelişmiş Bash-Scripting Guide oldukça iyidir. Adına rağmen, temelleri ele alıyor.


RE: "çıkış 0". Senaryodan çıkmak onun aklındaki şey miydi bilmiyorum. Ama evet, bu harika bir rehber.
Trampas Kirk

Mesajın bir yardım metni olacağını varsayarak "ve" "aksi" olarak yorumladım. Ama eminim Werner bu satırın ne yaptığını ve isteyip istemediğini anlayabilir :)
Thomas

tabii ki teşekkürler! ve son olarak, kabuğa gösterilmemesi için komut dosyasındaki hata mesajlarını nasıl kapatabilirim?
yolu aç

Aradığınız belirli bir programdan kaynaklanan hataları mı kastediyorsunuz? Standart çıktılarını ve / veya standart hata akışlarını unutulmaya yüz tutabilir > /dev/nullve / veya 2> /dev/nullbundan sonra gönderebilirsiniz.
Thomas

4
Eksik bir argümanın kötü olduğunu düşünürseniz (komut dosyası gibi, başarılı bir şekilde çalışamaz), 0'dan ( exit 1) farklı bir şey döndürür . Dönüş / çıkış kodlarıyla ilgili olarak hızlı bir şekilde bulabileceğiniz başka kurallar da vardır, ancak önemli olan, başarıyı gösteren 0 olmaması gerektiğidir.
Felix

25

Yalnızca belirli bir argüman eksikse kefaletle ilgileniyorsanız, Parametre Değiştirme harikadır:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

11

Misal

 if [ -z "$*" ]; then echo "No args"; fi

Sonuç

No args

Detaylar

-z , string uzunluğu sıfır için tekli operatördür. $*tüm argümanlar. Alıntılar güvenlik içindir ve varsa birden fazla argümanı içerir.

Bunun gibi daha fazla operatör için "tekli" için man bash( / key) kullanın ve arayın .


7
Bununla ilgili (küçük) bir sorun, hiçbir argüman iletmekle argüman olarak boş bir dizge geçirmek arasında ayrım yapmamasıdır. Bu, bazı bağlamlarda önemli olabilir. [$ # -Eq 0] kullanarak her iki durumu da düzgün şekilde halledebilirsiniz.
Idelic

1
Ah, (ba) sh programlamanın incelikleri ... Bu yüzden ondan nefret ediyorum.
Thomas

1
düşünmek -zolarak mizzing
Ray Foss

4

Eski ama daha önceki bazı karışıklıklar nedeniyle cevabı şimdi yeniden ele almak için nedenim var:

if [[ $1 == "" ]] #Where "$1" is the positional argument you want to validate 

 then
 echo "something"
 exit 0

fi

Bu, konumsal bir argüman $ 1 yoksa "Bir şey" yankılayacaktır. Bununla birlikte, $ 1'in belirli bilgiler içerdiğini doğrulamaz.


$#açıkça bağımsız değişkenlerin sayısının tamsayı sayısıdır; ya "0" olacak ve hiçbir argüman olmamasına rağmen "bir şeyi" yankılayacaksınız veya bir pozitif sayı olacak ve "bir şeyi" doğru şekilde yankılayacaksınız. Ancak kontrolün kendisi, kullandığınız girdi veya girdi eksikliğine bakılmaksızın hiçbir zaman hiçbir şey yapmaz - her zaman$# bir değer içerdiğini bildirir . Yani bu tamamen yanlış ve asla iddia edildiği gibi çalışmayacak.
eschwartz

Bundan tamamen emin misin? Tam olarak bu biçimi kullanarak amaçlandığı gibi çalışan birkaç komut dosyam var. Cevabınızı okuduktan sonra hem maç hem de eksiklik için tekrar test ettim. Senaryonuzda # ile eşleşen konumsal bir argüman yoksa, $ # belirtilmezse bir değer içermez. Bash'in orada olmayan bir konumsal argümanda neden bir değer üstlendiği hiçbir anlam ifade etmiyor.
Ryan Smith

Deneyin echo $#ardından, bir komut dosyası /tmp/test.sh içeriği gibi mevcut olması sıra / bin / sh (veya / bin / tire ve ne olursa olsun diğer kabuk uygulamaları gibi / altında / bin bash çalıştırın. /tmp/test.shİçin "0" yankılanacak konsol, olacağı gibi /bin/dash /tmp/test.sh. Öte yandan, /tmp/test.sh foo"1" /tmp/test.sh first secondyankılanacak ve "2" yankılanacak.
eschwartz

Gereğince man bash, bölüm "Özel Parametreler", içinde; "ondalık konumsal parametrelerin sayısına # genişletir." "Birkaç parametreler özellikle Bu parametreler sadece referans olabilir kabuk davranır.. Onlara atama izin verilmez" ve Aynı şekilde, pubs.opengroup.org/onlinepubs/9699919799/utilities/…
eschwartz

Görünüşe göre bir yanlış iletişim var! # 'İ belirli konumsal bağımsız değişken için bir yer tutucu olarak kastetmiştim (yani, ikinci bağımsız değişkeni kastediyorsanız 2 $), gerçek $ # değil. Yukarıdakileri gözden geçirdikten sonra kesinlikle haklısınız, gerçek bir $ # her zaman argüman sayısını çözecektir. Karışıklık için özür dileriz.
Ryan Smith
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.