2014-11-24 31 views
5

başlatılıp başlatılmadığını test etme Bir değişkenin bashta doğru şekilde tanımlanıp tanımlanmadığını ve ilişkili değerini kullanması gerektiğini test etmek zorunda olan bir işlevi yürütmem gerekiyor. Örneğin, bu değişkenler komut dosyasının en üstünde başlatılır.Bir değişkenin var olup olmadığını ve

#!/bin/bash 

var1_ID=0x04 
var2_ID=0x05 
var3_ID=0x06 
var4_ID=0x09 

ben şöyle komut adındaki testi çağırmak istiyorum:

./test var1 

akım uygulanan fonksiyonudur: Ben here bile elde neden

function Get() 
{ 
    if [ $1"_ID" != "" ]; then 
     echo "here" 
     echo $(($1_ID)) 
    else 
     exit 0 
    fi 
} 

anlamıyorum ./test toto veya başka bir şey girdim.

grep gibi belirli bir komutu kullanmam gerekiyor mu?

+0

İlgili: [Bir değişken, herhangi bir değişkenin Bash sürümünde nounset kabuk seçeneğiyle sürüm 4.2'den önce nasıl tanımlanır?] (Http://unix.stackexchange.com/a/56846/40596) – fedorqui

+1

Kimseye benzemiyor bunu belirtti, ancak "$ 1" _ID "," $ 1 "yoksa" _ID "olarak değerlendirecektir. Ve bu nedenle her zaman olacak! "=" "" –

cevap

8

kullanabilirsiniz: ${!variable} ve sonra -n o tanımlanmış olup olmadığını kontrol etmek :

Dolaylı genişleme, bir değişkeni başka bir değişkenle çağırmaktan oluşur. Yani, değişken adı değişiyor olabilir, $a yerine ${!var} ve var=a dedik. Biz yürütmek durumunda

$ cat a 
var1_ID=0x04 
var2_ID=0x05 
var3_ID=0x06 
var4_ID=0x09 

for i in {1..5}; do 
    v="var${i}_ID" 
    if [ -n "${!v}" ]; then    # <-- this expands to varX_ID 
     echo "$v set to value: ${!v}" 
    else 
     echo "$v not set" 
    fi 
done 

, elde ederiz:

$ ./a 
var1_ID set to value: 0x04 
var2_ID set to value: 0x05 
var3_ID set to value: 0x06 
var4_ID set to value: 0x09 
var5_ID not set 

man test Gönderen:

-n STRING

STRING uzunluğu sıfırdan farklı olduğu

+1

Teşekkür ederim fedorqui. Ancak, anlayamayacağım. Ne demek $ {! V}? – ogs

+0

Buna ** dolaylı genişleme ** denir. Başka değişkenli bir değişkeni çağırmaktan oluşur. Yani, değişken adı değişebileceğinden, "$ a" demek yerine "$ {! Var}" ve "var = a" dedik. [Bash: dolaylı genişleme'de daha fazla bilgi edinebilirsiniz, lütfen açıklayınız?] (Http://stackoverflow.com/q/8515411/1983854). – fedorqui

+0

Gerçekten güzel! Çok teşekkürler – ogs

5

Kullanım Parametre genişlemesi: boş dize geçerli bir değer olup olmadığını

: ${var:?} 

(yani sadece tanımlanabilirlik test etmek istiyorum) iki nokta üst üste çıkarın. Eğer problem üzerinde durmak için komut dosyasını istemiyorsanız

: ${var?} 

, sen Muhtemelen dolaylı genişleme kullanmak istiyorum

if [[ ${var:+1} ]] ; then 
    # OK... 
else 
    echo Variable empty or not defined. >&2 
fi 
3

bash 4.2'de, belirtilen ada sahip bir değişken ayarlanmış olup olmadığını test etmek için koşullu ifadede -v işlecini kullanabilirsiniz.

if [[ -v ${1}_ID ]]; then 
    echo "${1}_ID is set" 
    foo=${1}_ID 
    echo "${!foo}" 
fi 

Değeri almak için hala dolaylı parametre genişletmeye ihtiyacınız var.

bash içinde 4.3 ile çalışmayı kolaylaştırmak için adlandırılmış bir referans kullanabilirsiniz.

declare -n param=${1}_ID 
if [[ -v param ]]; then 
    echo "${1}_ID" 
    echo "$param" 
fi 

(değişken o referansların adını almak için, declare -p param çıktısını ayrıştırma kısa kolay bir yolu varsa param tam olarak başvuran değişken gibi davranacaktır. Bilmiyorum.)

İlgili konular