【问题标题】:Find empty variables in bash array在 bash 数组中查找空变量
【发布时间】:2018-03-11 14:14:07
【问题描述】:

我在一个数组中有多个变量,我想遍历每个变量并查找它们是否为空。

代码:

declare -a CONFIG_PARAM=( $Var_MODE $Var_Path $Var_Stage $Var_line $Var_CVG $Var_Operator )
for PARAMS in "${CONFIG_PARAM[@]}"; do 
   if [ ! $PARAMS ]; then 
      echo -e "$PARAMS is empty"
   fi
done;

但它似乎没有捕捉到空变量。有人可以指出问题所在或提供任何建议/解决方案吗?提前感谢您的帮助。

【问题讨论】:

  • 行情。 "$Var_MODE" "$Var_PATH" 等和[ ! "$PARAMS" ]
  • 但这只是在您需要这些值的情况下。如果需要名称,则需要使用间接扩展。
  • 谢谢,我刚刚尝试并得到了值,但我需要打印变量名!

标签: arrays bash shell sh


【解决方案1】:
declare -a config_params=( Var_MODE Var_Path Var_Stage Var_line Var_CVG Var_Operator )
for param in "${config_params[@]}"; do 
   if ! [ -n "${!param}" ]; then 
      echo "$param is empty"
   fi
done

注意:

【讨论】:

  • 非常感谢,这很有帮助。但是我已经尝试了上面的代码,它仍然打印变量的值而不是变量名。
  • @GopinathS,......呃......不,它没有。看到这段代码在ideone.com/4iUpnd 上实际运行
  • 我的错,我没有为数组中的变量删除'$',对此感到抱歉。现在我从你的笔记中理解了间接引用的概念。非常感谢,感谢您的帮助。
【解决方案2】:

这是(IMO)循环使您的代码可读性降低的情况。对于一个很好的垂直调用列表,每个变量一行。

check_empty () {
    [ -z "${!1}" ] && printf '%s is empty\n' "$1"
}

并为每个变量单独调用。

check_empty Var_MODE
check_empty Var_Path
check_empty Var_Stage
check_empty Var_line
check_empty Var_CVG
check_empty Var_Operator

实际上,您甚至不需要单独的函数。参数扩展运算符:? 将显示一条错误消息,如果为空,则会显示变量名称。

: ${Var_MODE?empty} || :
: ${Var_Path?empty} || :
: ${Var_Stage?empty} || :
: ${Var_line?empty} || :
: ${Var_CVG?empty} || :
: ${Var_Operator?empty} || :

结尾的|| : 防止脚本在变量为空时退出。

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 2011-06-11
    • 1970-01-01
    • 2020-08-18
    • 2014-04-10
    • 2018-06-24
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多