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

Bash 如何测试变量是否存在并已初始化,bash,shell,variables,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"

我必须执行一个函数,该函数必须测试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
}
我不明白为什么我在这里获得
,即使我输入
/test toto
或其他东西


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

使用参数展开:

: ${var:?}
如果空字符串是有效值(即,您只想测试定义性),请删除冒号

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

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

您可能希望使用间接扩展:
${!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

人工测试

-n字符串

字符串的长度不为零


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
的输出之外,是否有一种简单的方法来获取它引用的变量的名称。)

相关:似乎没有人说过这一点,但是
$1“\u ID”
将计算为
“\ID”
如果
$1
不存在。因此将始终是
!=到“”
谢谢你,费多尔基。然而,我不明白。什么是${!v}?这称为间接扩展。它包括用另一个变量调用一个变量。也就是说,由于变量名可能正在更改,我们不是说
$$a
而是说
${!var}
var=a
。你可以在里面读更多。真的很好!感谢lotAnd,正如fedorqui通过指出的那样,您可以使用扩展
${variable+string}
测试是否设置了某些内容。
if [[ -v ${1}_ID ]]; then
    echo "${1}_ID is set"
    foo=${1}_ID
    echo "${!foo}"
fi
declare -n param=${1}_ID
if [[ -v param ]]; then
    echo "${1}_ID"
    echo "$param"
fi