2015-01-23 3 views
1

Я в YAML массива:Преобразование YAML массив Bash массив

myarray: 
    - PHP 
    - Perl 
    - Python 

Как преобразовать его в Баш массив с рубином?

Arr[0]='PHP' 
Arr[1]='Perl' 
Arr[2]='Python' 
+2

Что значит «преобразовать его в массив bash»? Что вы на самом деле пытаетесь сделать? – arco444

+0

Я хочу создать config.sh из файла yaml для бродячего бокса ... – Imaginaerum

ответ

3

Я не уверен, если это то, что вы хотите.

В рубина, разобрать массив YAML и написать выход для Bash, чтобы прочитать как массив:

require 'yaml' 

yaml_array = <<-eos 
myarray: 
    - PHP 
    - Perl 
    - Python 
eos 

yaml = YAML.load(yaml_array) 
print "(#{yaml["myarray"].join(' ')})" 

Этот рубиновый скрипт будет печатать (PHP Perl Python) на стандартный вывод.

Вы можете использовать его в Bash:

$ eval array=$(ruby ruby_script.rb) 
$ echo ${array[0]} 
PHP 
$ echo ${array[1]} 
Perl 
+0

Отлично! Это так, как я хочу. Большое спасибо – Imaginaerum

+0

Это будет безопаснее для оболочки: 'print '(\" # {yaml ["myarray"]. Join (' "" ')} \ ")" '- содержать любой элемент, содержащий пробельные символы –

2
require 'yaml' 

yaml_text = "myarray: 
    - PHP 
    - Perl 
    - Python" 

yaml = YAML.load(yaml_text) 
array = yaml["myarray"] 

puts array.class #=> Array 
puts array  #=> PHP 
       #=> Perl 
       #=> Python 
2

Баш mapfile команда полезна для преобразования строк стандартного ввода в массив:

$ cat file.yaml 
myarray: 
    - PHP 
    - Perl 
    - Python 
    - element with spaces 

$ mapfile -t array < <(ruby -ryaml -e 'yaml = YAML.load(File.read(ARGV.shift)); puts yaml["myarray"].join("\n")' file.yaml) 

$ for i in "${!array[@]}"; do echo "$i ${array[i]}"; done 
0 PHP 
1 Perl 
2 Python 
3 element with spaces 

Это избавляет от необходимости использовать eval в оболочке