У меня есть файл, который выглядит так:
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
"eval" тоже не работает:
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
Возможно ли это сделать?
eval declare -A arr=( $tests )
. Сбой, потому что=
оценивается до расширения переменной, поэтому массив видит["stringtests"]="6"
как одну строку. - person 123   schedule 31.10.2017eval
здесь можно полностью избежать, а когда его можно избежать, его следует. - person Charles Duffy   schedule 31.10.2017