2015-05-30 6 views
6

ВыходSplit вывод команды в ассоциативный массив в Баш

/  ext4 
/boot ext2 
tank zfs 

На каждой строке разделителем является пробел. Мне нужен ассоциативный массив вроде:

"/" => "ext4", "/boot" => "ext2", "tank" => "zfs" 

Как это делается в bash?

+0

Вовсе нет, к сожалению. Вы не можете иметь косые черты в ключах ассоциативных массивов в bash. Чего вы в конечном итоге пытаетесь достичь, поэтому я могу предложить обходные пути? – Wintermute

+3

@Wintermute, pardon? Конечно, можно; единственным символом, недействительным в теле ключа, является NUL. Вы действительно протестировали это заявление? –

+0

@CharlesDuffy 'arr [/] = bar' не работает для меня с bash 4.3. И ничего не делает с '/' в нем. 'bash: /: синтаксическая ошибка: ожидаемый операнд (токен ошибки -«/»)' - ошибка. Цитаты не помогают. – Wintermute

ответ

11

Если вывод команды в файл 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")' 
+2

Ничего себе это просто взорвало мой разум, мне определенно нужно читать массивы. – ShellFish

Смежные вопросы