为什么Bash关联数组declare -A单次赋值生效而分两步赋值失效?
核心原因
两种写法的差异来自Bash对关联数组复合赋值语法的解析规则,两种表现都是Bash官方定义的预期行为。
场景1执行逻辑
当你在declare -A声明关联数组的同一条语句完成赋值时,declare命令会自动识别右侧符合([key]=value ...)格式的字符串,将其解析为关联数组的键值对完成初始化:
make_person() { echo '([firstName]=Bob [lastName]=Black)'; } declare -A person1=$(make_person) # 此时declare会解析右侧的复合赋值格式 echo "${person1[firstName]}" # 键存在,输出Bob
这种场景下person1是结构正常的关联数组,包含firstName和lastName两个键。
场景2执行逻辑
当你先单独声明关联数组,再进行赋值时,Bash会把person2=$(make_person)判定为标量赋值操作,不会主动解析右侧的复合赋值格式:
declare -A person2 person2=$(make_person) # 仅将整个输出字符串赋值给person2的默认0下标键 echo "${person2[firstName]}" # firstName键不存在,输出为空
此时如果执行echo "${person2[0]}",会输出完整的([firstName]=Bob [lastName]=Black)字符串,验证整个返回值被存在了默认下标下。
补充:场景2的正确写法
如果需要分开声明和赋值,需要显式触发复合赋值解析,动态内容可以用eval处理(注意仅在信任输出来源时使用eval):
declare -A person2 eval "person2=$(make_person)" # 显式触发复合赋值解析 echo "${person2[firstName]}" # 正常输出Bob
内容的提问来源于stack exchange,提问作者jmrah
相关产品推荐
相关产品推荐

