Если вывод команды в файл file
, то:
$ declare -A arr=(); while read -r a b; do arr["$a"]="$b"; done <file
Или, вы можете прочитать данные непосредственно из команды cmd
в массив следующим образом:
$ declare -A arr=(); while read -r a b; do arr["$a"]="$b"; done < <(cmd)
Конструкт <(...)
is замена процесса. Это позволяет нам читать из команды так же, как если бы мы читали из файла. Обратите внимание, что пространство между двумя <
имеет важное значение.
Вы можете проверить, что данные были правильно читать с помощью declare -p
:
$ declare -p arr
declare -A arr='([tank]="zfs" [/]="ext4" [/boot]="ext2")'
Вовсе нет, к сожалению. Вы не можете иметь косые черты в ключах ассоциативных массивов в bash. Чего вы в конечном итоге пытаетесь достичь, поэтому я могу предложить обходные пути? – Wintermute
@Wintermute, pardon? Конечно, можно; единственным символом, недействительным в теле ключа, является NUL. Вы действительно протестировали это заявление? –
@CharlesDuffy 'arr [/] = bar' не работает для меня с bash 4.3. И ничего не делает с '/' в нем. 'bash: /: синтаксическая ошибка: ожидаемый операнд (токен ошибки -«/»)' - ошибка. Цитаты не помогают. – Wintermute