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 , test
veya[
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, bash
ile set -o nounset
seç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 nounset
seçeneği set +u
( set -u
ile eşdeğer set -o nounset
) ile iptal edebilirsiniz .