如何测试变量是否存在并已初始化

时间:2014-11-24 15:14:32

标签: bash shell variables

我必须执行一个必须测试变量是否已在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

3 个答案:

答案 0 :(得分: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

     

STRING的长度非零

答案 1 :(得分:5)

使用参数扩展:

: ${var:?}

如果空字符串是有效值,则删除冒号(即,您只想测试定义性)。

: ${var?}

如果您不希望脚本停止此问题,可以使用

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

答案 2 :(得分: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的输出,就得到变量的名称吧的引用。)

相关问题