Bir komuta verilen parametre olup olmadığını nasıl kontrol edebilirim?


73

$*Boş olup olmadığını nasıl kontrol edersiniz ? Başka bir deyişle, bir komuta verilen herhangi bir argüman bulunup bulunmadığı nasıl kontrol edilir?

Yanıtlar:


110

Komuta verilen herhangi bir argüman olup olmadığını kontrol etmek için, $#değişken değişkeninin değerini kontrol edin ve ardından

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi

Kullanmak istiyorsanız $*( tercih edilmez ),

if [ "$*" == "" ]; then
    echo "No arguments provided"
    exit 1
fi

Bazı açıklamalar:

İkinci yaklaşım tercih edilemez, çünkü konumsal parametrede genleşme konumsal parametrelere *genişler, birinden başlayarak. Genişleme çift tırnak içinde gerçekleştiğinde, IFS özel değişkeninin ilk karakteri ile ayrılan her parametrenin değeri ile tek bir kelimeye genişler. Bu bir dize inşa edildiği anlamına gelir. Bu yüzden fazladan ek yükü var.

Diğer yandan #, konumsal parametrelerin sayısına genişler.

Örnek:

$ command param1 param2

İşte,

Değeri $#2 ve değeri $*IFS tanımsız ise, (tırnaklar olmadan) dizesi "Param1 param2" dir. Çünkü IFS ayarlanmadıysa, parametreler boşluklarla ayrılır.

Daha fazla ayrıntı man bashve Özel Parametreler adlı konuyu okumak için


5
Veya if ! (($#)); ..., veya if (($# == 0)); ..., veya if [ $# -eq 0 ]; ..., veya ! (($#)) && ...,(($#)) || ...
nicerobot

7
[ $# -eq 0 ]IME'nin en yaygın şeklidir. "$#"Boş olabilen kenar durumu var: boş olan tek bir argüman varsa veya birkaç boş argüman varsa ve $IFSboşsa.
Gilles

1
"$*"İfadesi ayrıca değerlendirecek ""tek eğer ""parametre geçirildi. Ama çoğu zaman zaten muhtemelen umursamayacaksın.
Manat çalışması

== ... yerine = olması gerektiğine inanıyorum, şu anda beklenmedik bir operatör hatası alıyorum ve = olarak değiştirmek sorunu çözüyor.
aslında aslında

@ Charlotte Bu kullanmadığınız anlamına gelir bash. shKomut dosyasını yürütmek için kullanıyorsunuz . AFAIK ==sadece içinde geçerlidir bash.
Sachin Divekar

14

Eğer sadece belirli bir argüman eksikse kurtarma ile ilgileniyorsanız, Parametre Değiştirme harika:

#!/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

-4

Bu, sahip olmadığın herhangi bir tartışmanın olmadığını bildiğin yollardan biri.

NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
    {do something}
fi

5
Kabul edilen cevabın 5 yıl önce yazdığı şeyi yapmanın kıvrımlı bir yolu gibi görünüyor ....
Jeff Schaller
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.