在此回答并澄清@acan和@sailnfool的答案。我发现需要通过一些示例场景来深入理解他们所描述的方法的细微差别(感谢@sailnfool在您的答案中创建的示例脚本)。无论如何,如果我仅仅回复@sailnfool的帖子并留下评论,我的评论将不会很清晰,所以我在这里进行回答。
澄清@sailnfool的脚本/答案的逻辑/结果:
1.如果定义了一个数组,但是数组中的特定元素(键)从未被定义:两个查询都返回“数组元素不存在”的结果
2.如果数组元素的值先前存在并已取消设置:两个查询都返回“数组元素不存在”的结果
3.如果数组元素(键)的值不为NULL:两个查询都返回“数组元素存在”
4.如果数组元素的值为NULL:第一个查询返回“数组元素存在”
5.如果数组元素的值为NULL:第二个查询返回“数组元素不存在”
我不太确定原始问题是要求推导特定数组元素是否存在(即特定数组元素是否已声明),还是要求推导特定数组元素是否具有值(非null)。
如果意图是确定特定数组元素是否曾经被设置(包括将其设置为NULL),则使用此方法:
[[ ${arr[c]+1} ]] && echo "array key exists" || echo "array key does not exist"
例如:
declare -A arr
arr["c"]=""
[[ ${arr[c]+1} ]] && echo "array key exists" || echo "array key does not exist"
或者
declare -A arr
arr["c"]=''
[[ ${arr[c]+1} ]] && echo "array key exists" || echo "array key does not exist"
如果用户的意图是检测数组元素何时存在并随后被取消设置,或特定数组元素从未被创建,任何两种分支方法都将返回相同的结果。即该元素不存在。因此,总结一下...它们之间唯一的区别在于第一种方法(如上所示的示例)能够在数组元素存在但设置为NULL时进行分支。而第二个分支方法只有在定义了数组元素并且包含非空值时才会返回真实路径(数组元素存在)。
底线是:
您的需求场景1:告诉我何时定义了一个数组元素,并且 = 任何值,包括NULL
使用:第一个分支方法
[[ ${arr[c]+1} ]] && echo "array key exists" || echo "array key does not exist"
您的需求场景2:告诉我何时定义了一个数组元素并且包含非NULL值
使用:任何逻辑分支方法
[[ ${arr[c]+1} ]] && echo "array key exists" || echo "array key does not exist"
或者
[[ ${arr[c]:+1} ]] && echo "array key exists" || echo "array key does not exist"
您的需求场景3:告诉我何时根本没有定义数组元素(即从未定义或已定义并随后取消设置)
使用:任何逻辑分支方法
[[ ${arr[c]+1} ]] && echo "array key exists" || echo "array key does not exist"
或者
[[ ${arr[c]:+1} ]] && echo "array key exists" || echo "array key does not exist"
if [[ -v RPM_PARAMETERS_HASH[${USER_PARAMETERS_KEYS[j]}] ]]; then
,但 if 条件仍未满足。 - Steve${USER_PARAMETERS_KEYS[j]}
评估为环境变量名称时,操作失败。 - Myridium