shell 是否声明字典

x6492ojm  于 2023-01-17  发布在  Shell
关注(0)|答案(3)|浏览(145)

有没有办法检查字典是否在shell中声明?
有一种方法可以检查变量不为空,也有一种方法可以检查字典是否有键,但不确定检查字典是否存在的正确方法是什么。
我想我找到解决办法了

declare -A dictionary
dictionary[key]="val"

if [[ -z $(declare -p dictionary 2> /dev/null) ]]
then
  echo no
else
  echo yes
fi

但也许有一个更地道的呢?

dzjeubhm

dzjeubhm1#

不使用子shell的多种方式:

if declare -p dictionary 2> /dev/null
then printf 'dictionary is declared!\n'
fi

要确保dictionary已声明且为关联数组:

if [[ "${dictionary@a}" = *A* ]]
then printf 'dictioary is declared as an Associative array!\n'
fi
roejwanj

roejwanj2#

你的declare -p技巧可能是唯一的方法来知道一个变量在被赋值之前已经被标记为declare -A(编辑:在Bash 5.0之前)。变量本身在您向数组中插入数据之前是未设置的,因此使用[[ -z ${var+x} ]]之类的典型技巧是行不通的。
如果您有Bash 5.0或更高版本,则显然存在expansion to test for an associative array

$ declare x; echo "${x@a}"

$ declare -a y; echo "${y@a}"
a
$ declare -A z; echo "${z@a}"
A

要检查数组是否具有键,可以用途:

#!/bin/bash
declare -A arr1 arr2
arr1=( ["foo"]=bar )
if [[ "${!arr1[@]}" ]] ; then
  echo "arr1 has keys"
fi
if [[ "${!arr2[@]}" ]] ; then
  echo "arr2 has keys"
fi
# prints "arr1 has keys"
yvgpqqbh

yvgpqqbh3#

我想我找到解决办法了

declare -A dictionary
dictionary[key]="val"

if [[ -z $(declare -p dictionary 2> /dev/null) ]]
then
  echo no
else
  echo yes
fi

但也许有一个更地道的呢?

相关问题