Bash检查字符串是否作为变量存在

时间:2016-03-14 18:14:11

标签: bash variables defined

我需要能够检查bash中是否设置了各种类似的变量。

我需要检查变量CONFIG_STRING_TO_CHECK中定义的字符串是否已设置。

我想做这样的事情:

#!/bin/bash

CUSTOM_PREFIX='custom1'

# Common Variable Name Endings:
CONFIG_STRINGS=( "config1" "config2" )

# Loop over common variable endings
for CONFIG_STRING in "${CONFIG_STRINGS[@]}" do :

  # Set the variable name to check
  CONFIG_STRING_TO_CHECK="${CUSTOM_PREFIX}_$CONFIG_STRING"

  # Check if variable is defined
  if [ -z ${CONFIG_STRING_TO_CHECK+x} ]; then
    echo "$CONFIG_STRING_TO_CHECK is declared";
  else
    echo "$CONFIG_STRING_TO_CHECK is not declared"; 
    exit 1;
  fi

done

经过一些谷歌搜索后,我发现了this answer,但它无法正常工作。我认为这是因为这是检查变量CONFIG_STRING_TO_CHECK是否已设置...它始终是。

为了清楚起见,我希望检查是否设置了以下字符串:

custom1_config1
custom1_config2

CONFIG_STRING_TO_CHECK

我希望这是有道理的。皮斯帮助。

2 个答案:

答案 0 :(得分:5)

使用间接扩展(for name, location in name_location_data: sql = "UPDATE {tbl} SET location=? WHERE name=?".format(tbl=table_name) cursor.execute(sql, name, location) ),如下所示:

!

请注意,您必须有一个中间变量名才能执行此操作 - 您无法执行~> A=a ~> B=b ~> a_b=c ~> A_B=${A}_${B} ~> echo ${!A_B} c 。有关详细信息,请参阅echo ${!${A}_${B}}

  

如果参数的第一个字符是感叹号(!),那么   引入了一个变量间接层。 Bash使用的值   由参数的其余部分形成的变量作为名称   变量;然后展开此变量,并在该变量中使用该值   其余的替换,而不是参数本身的值。   这被称为间接扩张。对此的例外是   下面描述的$ {!prefix *}和$ {!name [@]}的扩展。该   感叹号必须紧跟左支撑以便   介绍间接。

编辑:我刚试过这个,似乎有效:

man bash

得到了:

# !/bin/bash

CUSTOM_PREFIX='custom1'

custom1_config1="hi"
#custom1_config2="there"

# Common Variable Name Endings:
CONFIG_STRINGS=( "config1" "config2" )

# Loop over common variable endings
for CONFIG_STRING in "${CONFIG_STRINGS[@]}"; do
        CONFIG_STRING_TO_CHECK="${CUSTOM_PREFIX}_${CONFIG_STRING}"
        if [ -z ${!CONFIG_STRING_TO_CHECK} ]; then
                echo ${CONFIG_STRING_TO_CHECK} is not defined
        else
                echo ${CONFIG_STRING_TO_CHECK} is ${!CONFIG_STRING_TO_CHECK}
        fi
done

答案 1 :(得分:3)

declare内置版可以使用-p选项向您显示。

$ var=PATH
$ if declare -p "$var" &>/dev/null; then echo "$var is declared"; fi
PATH is declared
$ var=FOOBAR
$ if declare -p "$var" &>/dev/null; then echo "$var is declared"; else echo "$var is not declared"; fi
FOOBAR is not declared

此外,这可以封装到一个函数中:

$ is_declared() { declare -p "$1" &>/dev/null; }
$ if is_declared PATH; then echo OK; else echo NO; fi
OK
$ is_declared FOOBAR && echo OK || echo NO
NO

它适用于函数本地声明的变量

$ test_func() { local localvar=42; is_declared localvar && echo OK || echo NO; }
$ test_func
OK