Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 访问bash数组密钥(mac)_Macos_Bash_Unix - Fatal编程技术网

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版本的变通方法。