eval declare -A USERARRAY=(
$(awk -F: '{ printf "[\"%s\"]=\"%s\"\n", $1, $6}' /usrmkr/in.out)
)
Скрипт awk
производит вывод в формате [key]=val
, который требуется при установке нескольких элементов ассоциативного массива bash, и заключает в двойные кавычки и ключ, и значение (["key"]="value"
) в случае наличия пробелов, табуляций и т.д. в ключах или значениях.
Я использовал \n
в качестве разделителя, чтобы упростить задачу на случай, если вы захотите обработать вывод awk
другим инструментом (хотя awk
может делать большинство вещей, которые вы, в любом случае, захотите сделать с помощью других инструментов).
Замена команд должна быть достаточной сама по себе... но из-за ошибки в bash
, которая, IMO, является ошибкой, если первый не пробельный символ внутри определения массива ( ... )
не является [
], он просто выдает сообщение об ошибке must use subscript when assigning associative array
.
например, обе следующие попытки установить USERARRAY будут неудачными:
$ bash --version | head -1
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
$ declare -A USERARRAY=($(awk -F: '{ printf "[\"%s\"]=\"%s\"\n", $1, $6}' /usrmkr/in.out))
bash: USERARRAY: $(awk -F: '{ printf "[\"%s\"]=\"%s\"\n", $1, $6}' /usrmkr/in.out): must use subscript when assigning associative array
$ UA=$(awk -F: '{ printf "[\"%s\"]=\"%s\"\n", $1, $6}' /usrmkr/in.out)
$ declare -A USERARRAY=( $UA )
bash: USERARRAY: $UA: must use subscript when assigning associative array
Решением является использование eval
при объявлении хэшированного массива, как в примере кода в верхней части моего ответа. Или,
eval declare -A USERARRY=( $UA )