SORU
23 EKİM 2008, PERŞEMBE


Nasıl bir dize bash kabuk tanımlı olup olmadığını söylemek için mi?

Eğer boş bir dize için kontrol etmek istersem yaparım

[ -z $mystr ]

ama eğer değişken tanımlı olup olmadığını kontrol etmek istersem ne olur? Yoksa bash betik bir fark yok mu?

CEVAP
23 EKİM 2008, PERŞEMBE


Cevabı basitçe yazılmış olmasa da örtülü (ifade) Vinko cevabı ile sonra sanırım. VAR ama boş olsun ya da olmasın ayarlanmış olup olmadığını ayırt etmek için kullanabilirsiniz:

if [ -z "${VAR xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR xxx}" = "xxx" ]; then echo VAR is set but empty; fi

Muhtemelen içine: ikinci satırda iki test birleştirebilirsiniz

if [ -z "$VAR" -a "${VAR xxx}" = "xxx" ]; then echo VAR is set but empty; fi

Eğer Autoconf belgeleri okursanız ancak, '-a' ve && ile birlikte ayrı basit testler kullanmanızı öneririz. ile birleştirilmesi açısından tavsiye etmiyorlar bulacaksınız Vermedim karşılaşılan bir sistem nerede bir sorun varsa; o değil demek istemediler kullanılan var (ama onlar muhtemelen çok nadir bu günlerde bile değillermiş gibi nadir bulunan uzak geçmişte).


Son soru bu cevap hakkında e-posta ile sordu:

İki testleri kullanın, ve iyi, ama ilki değil ikincisini anlıyorum. Daha doğrusu değişken genişletme ihtiyacını anlamıyorum

if [ -z "${VAR xxx}" ]; then echo VAR is not set at all; fi

Bu aynı yapmak için yeterli olmaz mıydı?

if [ -z "${VAR}" ]; then echo VAR is not set at all; fi

Soru - cevap 'Hayır, daha basit bir alternatif aynı şeyi yapmaz'.

Test önce: bu yaz sanırım

VAR=

Test diyecek ki, "VAR hiç ayarlı değil", ama benim söyleyecek ima yoluyla bir şey yankıları çünkü) "VAR set ama değeri boş olabilir". Bu komut deneyin:

(
unset VAR
if [ -z "${VAR xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ];     then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ];     then echo MP:2 VAR is not set at all; fi
)

Çıktı

JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all

Testlerin ikinci çift, değişken ayarlanır, ama boş değere sahiptir. Bu ${VAR=value} ${VAR:=value} gösterimler yapmak ünvandır. ${VAR-value} ** 22 ${VAR value} ${VAR: value} ve Benzerleri için Ditto.


Gili set -o nounset seçeneği ile onun içinde eğer çalıştırırsanız answer, bash belirttiği gibi, temel cevap yukarıda unbound variable ile başarısız olur. Bir şekilde telafi edilir:

if [ -z "${VAR xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR xxx}" = "xxx" ]; then echo VAR is set but empty; fi

Ya set u 29 *seçeneği (set -u set -o nounset eşdeğer) iptal edebilirsin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CNNMoney

    CNNMoney

    16 Kasım 2006
  • GirlSanctuaryBlog

    GirlSanctuar

    28 Aralık 2011
  • Jonathan Flavell

    Jonathan Fla

    1 HAZİRAN 2006