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的输出时偶然发现了它。