2014-11-24 81 views
5

我必須執行一個必須測試變量是否已在bash中正確定義並且必須使用其相關值的函數。如何測試變量是否存在並已初始化

例如,這些變量在腳本的頂部被初始化。

#!/bin/bash 

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

我想打電話給名爲test的腳本如下:

./test var1 

目前實施的功能是:

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

我不明白爲什麼我得到here即使我輸入./test toto或別的東西。

是否需要使用特定的命令,例如grep

+0

相關:[如何測試一個變量是否在4.2版之前的Bash中使用名詞集shell選項定義?](http://unix.stackexchange.com/a/56846/40596) – fedorqui 2014-11-24 15:20:17

+1

似乎沒有人已經說明了這一點,但如果'$ 1'不存在,'$ 1'_ID「'將評估爲'_ID''。因此,將始終是'!='「'' – 2017-01-23 15:58:17

回答

8

你可能想使用間接擴展:${!variable}然後-n檢查是否已經將它定義:

間接擴展包括調用另一個變量的變量。也就是說,由於變量名稱可能會發生變化,因此我們不會說$a而是${!var}var=a

$ 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 

如果我們執行,我們得到:

$ ./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

-n STRING

字符串的長度爲非零

+1

謝謝你fedorqui。但是,我不明白。什麼意思是$ {!v}? – ogs 2014-11-24 15:30:32

+0

這被稱爲**間接擴展**。它包含用另一個變量調用一個變量。也就是說,由於變量名稱可能正在改變,我們不會說'$ a',而是說'$ {!var}'和'var = a'。你可以閱讀更多[bash:間接擴展,請解釋?](http://stackoverflow.com/q/8515411/1983854)。 – fedorqui 2014-11-24 16:02:04

+0

真的很好!非常感謝 – ogs 2014-11-24 17:16:23

5

使用參數擴展:

: ${var:?} 

取出結腸如果空字符串是一個有效的值(即你只是想測試definedness)。

: ${var?} 

如果你不想讓腳本停止對這個問題,你可以使用

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

bash 4.2,你可以使用-v運營商在條件表達式如果具有給定名稱的變量設置爲測試。

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

您仍需要間接參數擴展才能獲取該值。

bash 4.3你可以使用一個命名參考來使它更容易處理。

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

param的行爲完全像它引用的變量。我不知道是否有一個簡單的方法,短解析的declare -p param輸出,以獲得變量引用它的名字。)