2012-07-27 56 views
29

Ortam değişkeni ayarlanıp ayarlanmadığını kontrol etmem gereken bir kabuk komut dosyası yazıyorum. Bir ortam değişkeni önceden ayarlanmış olsun ya da olmasın, kabuk betiğini kontrol etmenin herhangi bir yolu var mı?Ortam değişkeni ayarlanmış olup olmadığını kontrol edin

+0

Aslında, bu sorunun gerçek bir kopyası değildir: OP, bir değişkenin ayarlanıp ayarlanmadığını ve bir komut dosyası çıkarılmak yerine onunla ilgili bir şey yapıp yapmadığını bilmek ister. Bu durumda $ {V :?} geçerli bir cevap değildir. set | grep -q '^ V =' 'dır. Bu, değişkenin varlığı için test eder ve değişken ayarlanmış olsa bile boş dizeye çalışır. – Coroos

cevap

27
[ -z "$VARIABLE" ] && VARIABLE="abc" 

if env | grep -q ^VARIABLE= 
then 
    echo env variable is already exported 
else 
    echo env variable was not exported, but now it is 
    export VARIABLE 
fi 

Sana VARIABLE olabileceğinden, [ -z $VARIABLE ] yeterli olmadığını vurgulamak istiyoruz ama ihraç edilmedi. Bu, bir ortam değişkeni olmadığı anlamına gelir.

+0

Bu, tüm kabuk ortamlarında çalışır mı? – Mojoy

+0

@Senthilnathan: Evet, elbette, bu peacof kodunu daha taşınabilir yapmak için yeniden yazılabilen tek şey "grep -q". Biri yazabilirdi | env | Bunun yerine grep^VARIABLE =>/dev/null'. –

+0

Bir değişkeni dışa aktarırsam, değişkeni dışa aktarmadan başka bir şeye ayarlarsanız, dışa aktarılmayan değişken ile dışa aktarılan değişkenim arasında eşleşmiyor mu yoksa dışa aktarılanı da otomatik olarak mı günceller? – ArtOfWarfare

7
if [ -z "$VARIABLE" ]; then 
    VARIABLE=... 
fi 

Bu, $ VARIABLE uzunluğunun sıfır olup olmadığını kontrol eder.

13

Ne yapmak istediğiniz bash yerli, denir parametre ikamesi: DEĞİŞKEN ayarlanmazsa

VARIABLE="${VARIABLE:=abc}" 

, sağ taraftaki abc eşit olacaktır. Dahili operatörün: = ile değiştirilebileceğini unutmayın: - VARIABLE ayarlı veya boş değilse test eder.

+0

Tam olarak aradığım şey. TEST_DATABASE_NAME dışa aktarma satırı = "$ {TEST_DATABASE_NAME: = prodlike}", TEST_DATABASE_NAME zaten tanımlı değilse yalnızca prodlike'yi varsayılan olarak kullanacaktır. Dağınık şartsız blok yok. Hepsi bir kod satırında. –

46

şartlı (ortamda veya olmasın) bir değişken atamak standart çözümdür:

o ayarlanmazsa yalnızca değer "foo" için VAR ayarlayacaktır
: ${VAR=foo} 

.

: ${VAR:=foo} 

, çevrede VAR koymak takip etmek için::

export VAR 

Ayrıca yapabilirsiniz export VAR=${VAR-foo} VAR ayarlanmazsa veya boş dize, kullanım ise
VAR için "foo" ayarlamak için veya export VAR=${VAR:=foo}, ancak bazı eski kabuklar, aynı satırdaki atama ve dışa aktarma sözdizimini desteklemez. Ayrıca, DRY; = operatörünün iki tarafındaki adı kullanmak gereksiz tekrarlamadır. (Değişkeni veren ikinci bir satır aynı ilkeyi ihlal eder, ancak daha iyi hisseder.)

Ortamda bir değişkenin olup olmadığını belirlemek genel olarak çok zor olduğunu unutmayın. env çıktısını ayrıştırma çalışmaz.

export foo=' 
VAR=var-value' 
env | grep VAR 

Ne de bir altkabuk ve testi yumurtlamaya çalışır: düşünün VAR ortamında olduğunun göstergesi olacağını VAR belirtmek istiyorum

sh -c 'echo $VAR' 

alt kabukta ayarlanır, şu anki süreç, ancak basitçe VAR'ın alt kabuğun başlatılmasında ayarlanmış olması olabilir. Bununla birlikte, fonksiyonel olarak, sonuç VAR'ın çevrede olduğu gibi aynıdır. Neyse ki, VAR'ın çevrede olup olmadığını genellikle umursamıyorsunuz. Oraya ihtiyacın varsa, oraya koy. İhtiyacın varsa, çıkar onu.

+0

": $ {VAR: = foo}" gösteriminin dahili olarak nasıl çalıştığına dair bir açıklama ekleyebilir misiniz? Ben her zaman çözüm olarak buluyorum ama asla NASIL çalışır. –

+1

[StackOverflow] 'da bazı açıklamalar buldum (http://stackoverflow.com/questions/4437573/bash-assign-default-value)! –

İlgili konular