bash 脚本如果变量等于

bash 脚本如果变量等于

如何添加变量作为我想要检查值的变量的名称。我的代码如下,当我运行它时,我收到错误:

[: A_variable: integer expression expected

我认为这是因为在变量上执行 if 时,正确的语法应该是: if [ $A_variable -eq 1 ];但我无法将美元符号放在变量前面,因为我在变量的值中放入了不同的变量。

它几乎就像应该是: if [ $${letter}_variable 或一些混合,但我不知道是什么?

array=("A" "B" "C")

A_variable=1
B_variable=2
for letter in "${array[@]}"
do

if [ ${letter}_variable -eq 1 ]; then
...

答案1

这就是所谓的间接扩张在bash中。

获取名称由另一个变量确定的变量的值的语法namevar是:

${!namevar}

由于变量名由变量和常量字符串组成,因此您需要一个中间步骤:

array=("A" "B" "C")

A_variable=1
B_variable=2
for letter in "${array[@]}"
do
    varname="${letter}_variable"
    if [ "${!varname}" -eq 1 ]; then
    ...

笔记:如果间接引用的变量实际上不存在,则扩展将导致空字符串,这仍然会导致错误。如果这不合需要,请先添加第二个测试,如下所示:

    varname="${letter}_variable"
    if [ "${!varname}" = "" ]; then
        echo "Error: $varname is non-existent or empty"
    elif [ "${!varname}" -eq 1 ]; then
    ...

此外,如果所有可能的匹配变量的内容未提前初始化为安全值,那么使用双引号来防止扩展结果中出现意外字符将是一个好主意。

答案2

您正在将字符串(“A_variable”)与整数(“1”)进行比较。

您可以使用 来解决这个问题declare -n。从help declare

-n 使 NAME 成为对其值命名的变量的引用

我们需要[[ .. ]]避免未设置“C_variable”导致的错误。

#!/bin/bash
array=("A" "B" "C")

A_variable=1
B_variable=2
for letter in "${array[@]}"
do
  declare -n foo="${letter}_variable"
  if [[ "$foo" -eq 1 ]]; then
    echo "Ding"
  fi
done

奖励:您可以declare -i A_variable=1将其设为整数。

-i 使 NAME 具有“integer”属性

答案3

该运算-eq符用于数学表达式,但您正在比较字符串。

要比较字符串,请使用=.

相关内容