Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Arrays bash关联数组--包含值对的变量_Arrays_Bash_Variables_Associative - Fatal编程技术网

Arrays bash关联数组--包含值对的变量

Arrays bash关联数组--包含值对的变量,arrays,bash,variables,associative,Arrays,Bash,Variables,Associative,我有一个文件如下所示: stringtests (6 tests) alphatests (1 tests) arraytests (100 tests) 我可以提取并翻译成: ["stringtests"]="6" ["alphatests"]="1" ["arraytests"]="100" 我将这些放在变量测试中: ~> tests="[\"stringtests\"]=\"6\" [\"alphatests\"]=\"1\" [\"arraytests\"]=\"100\""

我有一个文件如下所示:

stringtests (6 tests)
alphatests (1 tests)
arraytests (100 tests)
我可以提取并翻译成:

["stringtests"]="6"
["alphatests"]="1"
["arraytests"]="100"
我将这些放在变量测试中:

~> tests="[\"stringtests\"]=\"6\" [\"alphatests\"]=\"1\" [\"arraytests\"]=\"100\""
然后我尝试使用变量将它们放入关联数组中,我得到一个错误:

~> declare -A arr=( $tests )
-bash: arr: ["stringtests"]="6": must use subscript when assigning associative array
-bash: arr: ["alphatests"]="1": must use subscript when assigning associative array
-bash: arr: ["arraytests"]="100": must use subscript when assigning associative array
评估也不起作用:

declare -A arr=( $(eval echo $tests) )
-bash: arr: [stringtests]=6: must use subscript when assigning associative array
-bash: arr: [alphatests]=1: must use subscript when assigning associative array
-bash: arr: [arraytests]=100: must use subscript when assigning associative array
但是,如果我直接输入值,它会起作用:

~> declare -A arr=( ["stringtests"]="6" ["alphatests"]="1" ["arraytests"]="100" )
~> echo ${arr[@]}
1 100 6
~> echo ${!arr[@]}
alphatests arraytests stringtests
甚至可以这样做吗?

更换

declare -A arr=( $tests )

输出:

declare -A arr='([alphatests]="1" [arraytests]="100" [stringtests]="6" )'
替换

declare -A arr=( $tests )

输出:

declare -A arr='([alphatests]="1" [arraytests]="100" [stringtests]="6" )'

我将完全避免使用temp变量,并在解析文件时填充数组

declare -A arr
while IFS= read -r line; do 
    # bash regex: the literal bits are quoted
    if [[ $line =~ (.+)" ("([0-9]+) ]]; then 
        arr["${BASH_REMATCH[1]}"]="${BASH_REMATCH[2]}"
    fi
done < file
declare -p arr

我将完全避免使用temp变量,并在解析文件时填充数组

declare -A arr
while IFS= read -r line; do 
    # bash regex: the literal bits are quoted
    if [[ $line =~ (.+)" ("([0-9]+) ]]; then 
        arr["${BASH_REMATCH[1]}"]="${BASH_REMATCH[2]}"
    fi
done < file
declare -p arr

declare不在子shell中之前需要eval.eval declare-A arr=$tests。失败,因为=在变量展开之前求值,所以数组将[stringtests]=6视为单个字符串。@123,嗯?这里可以完全避免eval,当可以避免eval时,它应该避免。@CharlesDuffy只是用他们的命令指出问题,而不是建议这是最好的选择。在declare之前需要eval,而不是在subshell中。eval declare-A arr=$tests。失败,因为=在变量展开之前求值,所以数组将[stringtests]=6视为单个字符串。@123,嗯?在这里可以完全避免eval,当可以避免eval时,它应该避免。@CharlesDuffy只是用他们的命令指出问题,而不是建议这是最好的选择。编写declare-A arr=$tests可能更安全一些,这样变量就可以被引用。@Cyrus转义/引用parenths如何使它以不同的方式解释内容?有什么文件吗?或者我遗漏了什么明显的东西吗?@123:我不知道细节。@Cyrus,你刚才偶然发现了吗?我不明白为什么会有什么不同。为什么只有在转义的情况下才会解释=?@123:我在查看:declare-p arr的输出时偶然发现了它。编写declare-A arr=$tests可能更安全,这样变量才会被引用。@Cyrus转义/引用parenths如何使它以不同的方式解释内容?有什么文件吗?或者我遗漏了什么明显的东西吗?@123:我不知道细节。@Cyrus,你刚才偶然发现了吗?我不明白为什么会有什么不同。为什么只有在转义的情况下才会解释=?@123:我在查看:declare-p arr的输出时偶然发现了它。