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

ogs*_*ogs 5 variables bash shell

我必须执行一个函数,必须测试变量是否已在bash中正确定义,并且必须使用其关联值.

例如,这些变量在脚本顶部初始化.

#!/bin/bash

var1_ID=0x04
var2_ID=0x05
var3_ID=0x06
var4_ID=0x09
Run Code Online (Sandbox Code Playgroud)

我想调用名为test的脚本如下:

./test var1
Run Code Online (Sandbox Code Playgroud)

当前实现的功能是:

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

here即使我进入./test toto或其他什么,我也不明白为什么我会得到.

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

fed*_*qui 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
Run Code Online (Sandbox Code Playgroud)

如果我们执行,我们得到:

$ ./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
Run Code Online (Sandbox Code Playgroud)

来自man test:

-n STRING

STRING的长度非零


cho*_*oba 6

使用参数扩展:

: ${var:?}
Run Code Online (Sandbox Code Playgroud)

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

: ${var?}
Run Code Online (Sandbox Code Playgroud)

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

if [[ ${var:+1} ]] ; then
    # OK...
else
    echo Variable empty or not defined. >&2
fi
Run Code Online (Sandbox Code Playgroud)