数组 – 使用Bash,是否可以将数组存储在字典中
发布时间:2020-12-15 21:26:46 所属栏目:安全 来源:网络整理
导读:使用bash,可以在字典中存储数组吗?我已经展示了一些从字典中获取数组的示例代码,但它似乎失去了它是一个数组的事实. 我希望它是dict =([“pos”] =“${array [@]}”)命令但不确定如何执行此操作或甚至是否可行. # Normal array behaviour (just an example)
使用bash,可以在字典中存储数组吗?我已经展示了一些从字典中获取数组的示例代码,但它似乎失去了它是一个数组的事实.
我希望它是dict =([“pos”] =“${array [@]}”)命令但不确定如何执行此操作或甚至是否可行. # Normal array behaviour (just an example) array=(1 2 3) for a in "${array[@]}" do echo "$a" done # Outputs: # 1 # 2 # 3 # Array in a dictionary declare -A dict dict+=(["pos"]="${array[@]}") # When I fetch the array,it is not an array anymore posarray=("${dict[pos]}") for a in "${posarray[@]}" do echo "$a" done # Outputs: # 1 2 3 # but I want # 1 # 2 # 3 解决方法
不,但有解决方法.
使用printf’%q’eval 您可以将数组展平为字符串: printf -v array_str '%q ' "${array[@]}" dict["pos"]=$array_str …然后使用eval将该数组扩展回来: # WARNING: Only safe if array was populated with eval-safe strings,as from printf %q key=pos; dest=array printf -v array_cmd "%q=( %s )" "$dest" "${dict[$key]}" eval "$array_cmd" 请注意,只有在使用printf’%q’通过代码填充关联数组以在值添加之前转义值时,这才是安全的.避免此过程的内容可能对eval不安全. 使用base64编码 更慢但更安全(如果您不能阻止通过不受信任的代码修改字典的内容),另一种方法是存储base64编码的NUL分隔列表: dict["pos"]=$(printf '%s ' "${array[@]}" | openssl enc base64) ……并以同样的方式阅读: array=( ) while IFS= read -r -d '' item; do array+=( "$item" ) done < <(openssl enc -d base64 <<<"${dict["pos"]}" 使用多变量间接扩展 这个实际上是对称的,虽然它需要bash 4.3或更新版本.也就是说,它将您的密钥名称限制为允许作为shell变量名称的密钥名称. key=pos array=( "first value" "second value" ) printf -v var_name 'dict_%q' "$key" declare -n var="$var_name" var=( "${array[@]}" ) unset -n var …之后声明-p dict_pos将发出声明-a dict_pos =([0] =“第一个值”[1] =“第二个值”).在另一端,用于检索: key=pos printf -v var_name 'dict_%q' "$key" declare -n var="$var_name" array=( "${var[@]}" ) unset -n var …之后声明-p数组将发出声明-a array =([0] =“第一个值”[1] =“第二个值”). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |