Macos 访问bash数组密钥(mac)
由于某些原因,我无法使用感叹号语法访问数组键:Macos 访问bash数组密钥(mac),macos,bash,unix,Macos,Bash,Unix,由于某些原因,我无法使用感叹号语法访问数组键: declare -a sites sites=(["fr"]="frederick" ["an"]="annapolis") for i in "${!sites[@]}" do echo "key: $i " done 这只是echo的输出键:0 我做错了什么 另外,我想增加一些价值 因此,我们的目标是: key:fr,value:frederick问题是declare-a 根据手册页,它应该是declare-A 请尝试以下方
declare -a sites
sites=(["fr"]="frederick" ["an"]="annapolis")
for i in "${!sites[@]}"
do
echo "key: $i "
done
这只是echo的输出键:0
我做错了什么
另外,我想增加一些价值
因此,我们的目标是:
key:fr,value:frederick问题是declare-a
根据手册页,它应该是declare-A
请尝试以下方法:
declare -A sites
sites=(["fr"]="frederick" ["an"]="annapolis")
for i in "${!sites[@]}"
do
echo "key: $i, value: ${sites[$i]}"
done
问题是declare-a
根据手册页,它应该是declare-A
请尝试以下方法:
declare -A sites
sites=(["fr"]="frederick" ["an"]="annapolis")
for i in "${!sites[@]}"
do
echo "key: $i, value: ${sites[$i]}"
done
这可以在旧的bash版本中完成
在旧版本的bash中,可以使用整个环境变量集来实现关联数组(也称为哈希)
export HASH_PREFIX="I_AM_A_HASH"
hash-set() {
HASH_NAME="$1" ; shift
HASH_KEY="$1" ; shift
HASH_VAL="$1" ; shift
eval "export ${HASH_PREFIX}_${HASH_NAME}_KEY_${HASH_KEY}='$HASH_VAL'"
}
hash-get() {
HASH_NAME="$1" ; shift
HASH_KEY="$1" ; shift
eval "echo \"\$${HASH_PREFIX}_${HASH_NAME}_KEY_${HASH_KEY}\""
}
hash-keys() {
HASH_NAME="$1" ; shift
HASH_PREFIX_NAME_LENGTH=$(( ${#HASH_PREFIX} + ${#HASH_NAME} + 6 ))
declare -x | while read -r LINE_READ ; do
LINE_READ="${LINE_READ:11}"
if [ x"${LINE_READ:0:HASH_PREFIX_NAME_LENGTH}" \
= x"${HASH_PREFIX}_${HASH_NAME}_KEY_" \
]
then
LINE_READ="${LINE_READ:HASH_PREFIX_NAME_LENGTH}"
LINE_READ="${LINE_READ/=*/}"
echo "${LINE_READ}"
fi
done
}
hash-set sites "fr" "frederick"
hash-set sites "an" "annapolis"
for i in $(hash-keys sites) ; do
echo "key: $i, value: $(hash-get sites $i)"
done
这些键被限制为与环境变量0-9、a-z、a-z、\ux相同的字符
您可以通过使用xx表示非字母数字ascii值来解决问题,例如5f表示u,而3f表示?。rosettacode具有如何在纯bash中在ascii字符和十六进制之间来回转换的功能
此外,在mac笔记本电脑上,您还可以安装自制软件,然后使用它安装更新的bash。
您还可以在awk、perl、ruby或python中使用完整的关联数组。这可以在旧的bash版本中完成
在旧版本的bash中,可以使用整个环境变量集来实现关联数组(也称为哈希)
export HASH_PREFIX="I_AM_A_HASH"
hash-set() {
HASH_NAME="$1" ; shift
HASH_KEY="$1" ; shift
HASH_VAL="$1" ; shift
eval "export ${HASH_PREFIX}_${HASH_NAME}_KEY_${HASH_KEY}='$HASH_VAL'"
}
hash-get() {
HASH_NAME="$1" ; shift
HASH_KEY="$1" ; shift
eval "echo \"\$${HASH_PREFIX}_${HASH_NAME}_KEY_${HASH_KEY}\""
}
hash-keys() {
HASH_NAME="$1" ; shift
HASH_PREFIX_NAME_LENGTH=$(( ${#HASH_PREFIX} + ${#HASH_NAME} + 6 ))
declare -x | while read -r LINE_READ ; do
LINE_READ="${LINE_READ:11}"
if [ x"${LINE_READ:0:HASH_PREFIX_NAME_LENGTH}" \
= x"${HASH_PREFIX}_${HASH_NAME}_KEY_" \
]
then
LINE_READ="${LINE_READ:HASH_PREFIX_NAME_LENGTH}"
LINE_READ="${LINE_READ/=*/}"
echo "${LINE_READ}"
fi
done
}
hash-set sites "fr" "frederick"
hash-set sites "an" "annapolis"
for i in $(hash-keys sites) ; do
echo "key: $i, value: $(hash-get sites $i)"
done
这些键被限制为与环境变量0-9、a-z、a-z、\ux相同的字符
您可以通过使用xx表示非字母数字ascii值来解决问题,例如5f表示u,而3f表示?。rosettacode具有如何在纯bash中在ascii字符和十六进制之间来回转换的功能
此外,在mac笔记本电脑上,您还可以安装自制软件,然后使用它安装更新的bash。
您还可以在awk、perl、ruby或python中使用完整的关联数组。我认为这可能是由于缺少大写字母造成的 declare-A_sites=[fr]=frederick[an]=annapolis 对于${!\u站点[@]}中的i;做 printf'%s->%s\n'${i}${{u站点[$i]} 完成 有助于上述分类的资源不限于: 关于declare-A用法的回答 这个问题的答案还包括Bash版本3或更低版本的解决方案 在阅读了另一个发布的答案的评论后,我想如果您仍然使用旧版本的Bash,并且由于某些原因无法进行更新,那么您会希望最后列出的答案能够得到解决 还有几条注释 散列集{ HASH_NAME=$1;移位 HASH_KEY=$1;移位 HASH_VAL=$1;移位 eval export${HASH\u PREFIX}{HASH\u NAME}{u KEY}='$HASH\u VAL' } 。。。没有移位或eval,并且带有必需的参数,可能看起来像 散列集{ 本地_name=${1:?${FUNCNAME[0]}未提供哈希名称} 本地_key=${2:?${FUNCNAME[0]}未提供哈希键} 本地_值=${3:?${FUNCNAME[0]}未提供值} 声明-g${HASH\u PREFIX}{{u name}}{u KEY}='${u value}' }
。。。希望这对将答案转化为可以投票的答案会有帮助。我认为可能是因为资本化不足造成的 declare-A_sites=[fr]=frederick[an]=annapolis 对于${!\u站点[@]}中的i;做 printf'%s->%s\n'${i}${{u站点[$i]} 完成 有助于上述分类的资源不限于: 关于declare-A用法的回答 这个问题的答案还包括Bash版本3或更低版本的解决方案 在阅读了另一个发布的答案的评论后,我想如果您仍然使用旧版本的Bash,并且由于某些原因无法进行更新,那么您会希望最后列出的答案能够得到解决 还有几条注释 散列集{ HASH_NAME=$1;移位 HASH_KEY=$1;移位 HASH_VAL=$1;移位 eval export${HASH\u PREFIX}{HASH\u NAME}{u KEY}='$HASH\u VAL' } 。。。没有移位或eval,并且带有必需的参数,可能看起来像 散列集{ 本地_name=${1:?${FUNCNAME[0]}未提供哈希名称} 本地_key=${2:?${FUNCNAME[0]}未提供哈希键} 本地_值=${3:?${FUNCNAME[0]}未提供值} 声明-g${HASH\u PREFIX}{{u name}}{u KEY}='${u value}' }
。。。希望这对将答案翻译成可以投票的东西会有帮助。这是我最初尝试的。但是如果我运行您发布的脚本,我会得到以下输出:第3行:declare:-A:invalid选项declare:usage:declare[-afFirtx][p][name[=value]…]key:0,value:annapolis这可能也很有用:bash-version GNU bash,version 3.2.481关联数组要求bash>=4.0。看见事实上,Bash3.2的手册页没有提到任何关联数组-@Mikel,这个问题被标记为macos,除非采取特殊措施,否则它总是Bash3.2。这是我最初尝试的。但是如果我运行您发布的脚本,我会得到以下输出:第3行:declare:-A:invalid option declare:usage:declare
[-afFirtx][p][name[=value]…]键:0,值:annapolis这可能也有帮助:bash-版本GNU bash,版本3.2.481关联数组要求bash>=4.0。看见事实上,Bash3.2的手册页没有提到任何关联数组-@Mikel,这个问题被标记为macos,除非采取了诸如或之类的特殊措施,否则它始终是bash 3.2。请不要使用eval,而是请参阅4之前bash版本的变通方法。请不要使用eval,而是请参阅4之前bash版本的变通方法。