我可以在bash中创建变量的别名吗?

我可以在bash中创建变量的别名吗?,bash,Bash,我想检查bash中是否存在一个变量,如下所示 if [ -z "$VARIABLE" ]; then echo "VARIABLE does not exist" else echo "VARIABLE exist" fi function generate_var_name() { echo "aaa" } VARIABLE_NAME=$(generate_var_name) if [ -z ${$VARIABLE_NAME:-""} ]; then # This give er

我想检查bash中是否存在一个变量,如下所示

if [ -z "$VARIABLE" ]; then
  echo "VARIABLE does not exist"
else
  echo "VARIABLE exist"
fi
function generate_var_name() { echo "aaa" }

VARIABLE_NAME=$(generate_var_name)
if [ -z ${$VARIABLE_NAME:-""} ]; then  # This give error message below.
  echo "VARIABLE does not exist"
else
  echo "VARIABLE exist"
fi
它很好用。但在下一步中,我想生成一个变量名,并检查具有该变量名的变量是否存在,如下所示

if [ -z "$VARIABLE" ]; then
  echo "VARIABLE does not exist"
else
  echo "VARIABLE exist"
fi
function generate_var_name() { echo "aaa" }

VARIABLE_NAME=$(generate_var_name)
if [ -z ${$VARIABLE_NAME:-""} ]; then  # This give error message below.
  echo "VARIABLE does not exist"
else
  echo "VARIABLE exist"
fi
然而,它没有起作用。它的错误消息是

${"$INCLUD_GUARD_NAME":-""}: bad substitution
再说一次,我想做的是 (1) 生成一个变量名nameA,并将其存储到另一个变量VarB。 (2) 使用变量varB,检查nameA的变量是否存在

有解决方案或建议的人,请告诉我


非常感谢。

看起来您需要变量的间接展开。此外,在条件语句中,条件似乎是相反的

export aaa=foobar
VARIABLE_NAME=aaa

if [ -n "${!VARIABLE_NAME}" ]; then
  echo "VARIABLE exist"
else
  echo "VARIABLE does not exist"
fi

更新:正如@chepner正确指出的,上面的测试实际上并没有检查变量是否定义,而是检查变量的计算结果是否为空字符串。此检查仅在目标是考虑未定义变量和定义为等于空字符串等效的变量时起作用。请参阅@chepner的答案,了解变量的正确存在性检查。

看起来您希望间接扩展变量。此外,在条件语句中,条件似乎是相反的

export aaa=foobar
VARIABLE_NAME=aaa

if [ -n "${!VARIABLE_NAME}" ]; then
  echo "VARIABLE exist"
else
  echo "VARIABLE does not exist"
fi

更新:正如@chepner正确指出的,上面的测试实际上并没有检查变量是否定义,而是检查变量的计算结果是否为空字符串。此检查仅在目标是考虑未定义变量和定义为等于空字符串等效的变量时起作用。请参阅@chepner的答案,了解变量的正确存在性检查。

bash
已经对变量的存在性进行了测试:

foo=3   # non-empty value
bar=    # empty value
# baz is not set
for v in foo bar baz; do
    if [[ -v $v ]]; then
        echo "$v is set; its value is ${!v}"
    else
        echo "$v is not set"
    fi
done

bash
已经对变量的存在性进行了测试:

foo=3   # non-empty value
bar=    # empty value
# baz is not set
for v in foo bar baz; do
    if [[ -v $v ]]; then
        echo "$v is set; its value is ${!v}"
    else
        echo "$v is not set"
    fi
done

谢谢你,梅林2011。你提到的变量名扩展aobve就是我想要的。再次感谢你。另外,为了记录在案,如果要进行数组访问,需要执行以下操作:
var='aaa[3];value=“${!var}”
而不是
var='aaa';value=“${!var[3]}”
…此测试变量是否具有非空值,而不是是否设置了该值。@chepner,我已更新为包含更正和指向答案的指针的答案。如果您认为有更清晰的方式来表达更正,请随意编辑,因为我不认为复制您的答案有什么用,也不能删除我的答案,因为我的答案已被接受。谢谢您,merlin2011。你提到的变量名扩展aobve就是我想要的。再次感谢你。另外,为了记录在案,如果要进行数组访问,需要执行以下操作:
var='aaa[3];value=“${!var}”
而不是
var='aaa';value=“${!var[3]}”
…此测试变量是否具有非空值,而不是是否设置了该值。@chepner,我已更新为包含更正和指向答案的指针的答案。如果您认为有更清晰的方式来表达更正,请随意编辑,因为我看不出复制您的答案有什么用,也无法删除我的答案,因为我的答案已被接受。
-z
不测试变量是否存在;它测试其扩展是否为空字符串。使用
[-v VARIABLE]
测试变量是否已设置。
-z
不测试变量是否存在;它测试其扩展是否为空字符串。使用
[-v VARIABLE]
测试变量是否已设置。谢谢你,切普纳给了我先进的技术。如果你不介意的话,你能给我一个学习[[]选项的方法吗?我搜索了[[],但我可以获得一些主要用于匹配的信息,但我无法获得您提供的足够信息。谢谢,再次谢谢你,切普纳。我能拿到。谢谢你,切普纳给我先进的技术。如果你不介意的话,你能给我一个学习[[]选项的方法吗?我搜索了[[],但我可以获得一些主要用于匹配的信息,但我无法获得您提供的足够信息。谢谢,再次谢谢你,切普纳。我可以得到它。