Ben tarafından (belirtilmediği sürece) sonra olan cevap ima düşünüyorum Vinko 'ın cevabı basitçe dile olmasa da. VAR'ın ayarlanmış ancak boş olup olmadığını ayırt etmek için şunları 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 ikinci satırdaki iki testi bir ile birleştirebilirsiniz:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Ancak, Autoconf belgelerini okursanız, terimlerin ' -a' ile birleştirilmesini önermediklerini ve ayrı basit testlerin birlikte kullanılmasını öneriyoruz &&. Sorun olan bir sistemle karşılaşmadım; bu, eskiden var olmadıkları anlamına gelmez (ancak uzak geçmişte nadir olmasalar bile, bu günlerde muhtemelen çok nadirdirler).
Bunların ayrıntılarını ve diğer ilgili shell parametre genişletmelerini , testveya[ komutunu ve koşullu ifadeleri Bash kılavuzunda bulabilirsiniz.
Kısa süre önce şu soruyla ilgili e-postayla soru soruldu:
İki test kullanıyorsunuz ve ikincisini iyi anlıyorum, ama birincisini değil. Daha doğrusu değişken genişleme ihtiyacını anlamıyorum
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
Bu aynı şeyi yapamaz mı?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
Adil soru - cevap 'Hayır, daha basit alternatifiniz aynı şeyi yapmaz'.
Bunu testinizden önce yazdığımı varsayalım:
VAR=
Testiniz "VAR hiç ayarlanmadı" diyecek, ama benimki (ima yoluyla hiçbir şey yankılamadığı için) "VAR ayarlandı ancak değeri boş olabilir" diyecektir. Bu komut dosyasını 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
İkinci test çiftinde, değişken ayarlanır, ancak boş değere ayarlanır. Bu ${VAR=value}ve ${VAR:=value}notasyonların yaptığı ayrımdır . Ditto ${VAR-value}ve ${VAR:-value}ve ${VAR+value}ve ${VAR:+value}ve böyle devam eder.
As Gili onun içinde işaret cevap koşarsan, bashile set -o nounsetseçeneği, daha sonra temel cevap yukarıdaki başarısız olur unbound variable. Kolayca giderilebilir:
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
Veya set -o nounsetseçeneği set +u( set -uile eşdeğer set -o nounset) ile iptal edebilirsiniz .