Сохранить вывод команды в массив

Смотрите на эта страница (раздел "Dependency Version Ranges"). То, что Вы могли бы хотеть сделать, является чем-то как

[1.2.3,)

, Эти диапазоны версии реализованы в Maven2.

22
задан 17.05.2020, 17:08

3 ответа

В первую очередь, Вам не обязательно нужен массив, для обработки вывода линию за линией можно сделать:

pdc status -a 2>&1 | grep 'okay' | while read line; do somecommand "$line"; done

, Если Вам действительно нужен массив, Glenn Jackman уже дал Вы лучший способ сделать это, но здесь является другим подходом:

#!/bin/bash
IFS= 

Объяснение:

  • $IFS=: $IFS удар разделитель поля ввода, устанавливая его на символ новой строки ([только 118]) гарантируют, что Ваши выходные строки не будут разделены на пробеле так, чтобы можно было сохранить каждую строку как элемент отдельного массива. Без этого каждый Word вывода Вашей команды был бы различным элементом.

    В зависимости от того, что Вы хотите сделать, это могла бы быть хорошая идея сохранить старое значение $IFS и восстановить его после того, как массив читается:

    oldifs="$IFS"
    IFS= 
  • $(command): Это называют замена команды и позволяет Вам сохранять вывод команды в переменной. Существует два способа сделать это:

    var=$(command)
    

    и

    var=`command`
    

    Из этих двух, эти $() лучше потому что:

    • Это может иметь дело с вложенными командами:

      var=$(command1 $(command 2))
      

      , Например var=$(cat $(find ~/))

    • Это имеет гораздо меньше проблем с заключением в кавычки и приводит к более чистому синтаксису. См. здесь для больше.

\n': $IFS удар разделитель поля ввода, устанавливая его на символ новой строки ([только 118]) гарантируют, что Ваши выходные строки не будут разделены на пробеле так, чтобы можно было сохранить каждую строку как элемент отдельного массива. Без этого каждый Word вывода Вашей команды был бы различным элементом.

В зависимости от того, что Вы хотите сделать, это могла бы быть хорошая идея сохранить старое значение $IFS и восстановить его после того, как массив читается:

[112]
  • $(command): Это называют замена команды и позволяет Вам сохранять вывод команды в переменной. Существует два способа сделать это:

    [113]

    и

    [114]

    Из этих двух, эти $() лучше потому что:

    • Это может иметь дело с вложенными командами:

      [115]

      , Например var=$(cat $(find ~/))

    • Это имеет гораздо меньше проблем с заключением в кавычки и приводит к более чистому синтаксису. См. здесь для больше.

  • \n' array=($(echo -e "foo bar\nbaz bar")) IFS="$oldifs"
  • $(command): Это называют замена команды и позволяет Вам сохранять вывод команды в переменной. Существует два способа сделать это:

    var=$(command)
    

    и

    var=`command`
    

    Из этих двух, эти $() лучше потому что:

    • Это может иметь дело с вложенными командами:

      var=$(command1 $(command 2))
      

      , Например var=$(cat $(find ~/))

    • Это имеет гораздо меньше проблем с заключением в кавычки и приводит к более чистому синтаксису. См. здесь для больше.

  • \n': $IFS удар разделитель поля ввода, устанавливая его на символ новой строки ([только 118]) гарантируют, что Ваши выходные строки не будут разделены на пробеле так, чтобы можно было сохранить каждую строку как элемент отдельного массива. Без этого каждый Word вывода Вашей команды был бы различным элементом.

    В зависимости от того, что Вы хотите сделать, это могла бы быть хорошая идея сохранить старое значение $IFS и восстановить его после того, как массив читается:

    [112]
  • $(command): Это называют замена команды и позволяет Вам сохранять вывод команды в переменной. Существует два способа сделать это:

    [113]

    и

    [114]

    Из этих двух, эти $() лучше потому что:

    • Это может иметь дело с вложенными командами:

      [115]

      , Например var=$(cat $(find ~/))

    • Это имеет гораздо меньше проблем с заключением в кавычки и приводит к более чистому синтаксису. См. здесь для больше.

  • \n' array=($(pdc status -a 2>&1 | grep 'okay'))

    Объяснение:

    • $IFS=: $IFS удар разделитель поля ввода, устанавливая его на символ новой строки ([только 118]) гарантируют, что Ваши выходные строки не будут разделены на пробеле так, чтобы можно было сохранить каждую строку как элемент отдельного массива. Без этого каждый Word вывода Вашей команды был бы различным элементом.

      В зависимости от того, что Вы хотите сделать, это могла бы быть хорошая идея сохранить старое значение $IFS и восстановить его после того, как массив читается:

      oldifs="$IFS"
      IFS= 
    • $(command): Это называют замена команды и позволяет Вам сохранять вывод команды в переменной. Существует два способа сделать это:

      var=$(command)
      

      и

      var=`command`
      

      Из этих двух, эти $() лучше потому что:

      • Это может иметь дело с вложенными командами:

        var=$(command1 $(command 2))
        

        , Например var=$(cat $(find ~/))

      • Это имеет гораздо меньше проблем с заключением в кавычки и приводит к более чистому синтаксису. См. здесь для больше.

    \n': $IFS удар разделитель поля ввода, устанавливая его на символ новой строки ([только 118]) гарантируют, что Ваши выходные строки не будут разделены на пробеле так, чтобы можно было сохранить каждую строку как элемент отдельного массива. Без этого каждый Word вывода Вашей команды был бы различным элементом.

    В зависимости от того, что Вы хотите сделать, это могла бы быть хорошая идея сохранить старое значение $IFS и восстановить его после того, как массив читается:

    [112]
  • $(command): Это называют замена команды и позволяет Вам сохранять вывод команды в переменной. Существует два способа сделать это:

    [113]

    и

    [114]

    Из этих двух, эти $() лучше потому что:

    • Это может иметь дело с вложенными командами:

      [115]

      , Например var=$(cat $(find ~/))

    • Это имеет гораздо меньше проблем с заключением в кавычки и приводит к более чистому синтаксису. См. здесь для больше.

  • \n' array=($(echo -e "foo bar\nbaz bar")) IFS="$oldifs"
  • $(command): Это называют замена команды и позволяет Вам сохранять вывод команды в переменной. Существует два способа сделать это:

    var=$(command)
    

    и

    var=`command`
    

    Из этих двух, эти $() лучше потому что:

    • Это может иметь дело с вложенными командами:

      var=$(command1 $(command 2))
      

      , Например var=$(cat $(find ~/))

    • Это имеет гораздо меньше проблем с заключением в кавычки и приводит к более чистому синтаксису. См. здесь для больше.

  • \n': $IFS удар разделитель поля ввода, устанавливая его на символ новой строки ([только 118]) гарантируют, что Ваши выходные строки не будут разделены на пробеле так, чтобы можно было сохранить каждую строку как элемент отдельного массива. Без этого каждый Word вывода Вашей команды был бы различным элементом.

    В зависимости от того, что Вы хотите сделать, это могла бы быть хорошая идея сохранить старое значение $IFS и восстановить его после того, как массив читается:

    [112]
  • $(command): Это называют замена команды и позволяет Вам сохранять вывод команды в переменной. Существует два способа сделать это:

    [113]

    и

    [114]

    Из этих двух, эти $() лучше потому что:

    • Это может иметь дело с вложенными командами:

      [115]

      , Например var=$(cat $(find ~/))

    • Это имеет гораздо меньше проблем с заключением в кавычки и приводит к более чистому синтаксису. См. здесь для больше.

  • 0
    ответ дан 17.05.2020, 17:08

    Если Вы просто хотите числа в конце каждой строки:

    numbers=( $(pdc ... | grep -oP 'okay.+?\K\d+ 

    , Если Вы хотите сохранить каждую строку в массив

    mapfile -t lines < <(pdc ...)
    

    Для получения данных из массивов:

    for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done
    echo
    printf "%s\n" "${lines[@]}"
    
    33
    22
    11
    
    [okay   ]: you are currently listening: 33
    [okay   ]: you are currently listening: 22
    [okay   ]: you are currently listening: 11
    
    ) )

    , Если Вы хотите сохранить каждую строку в массив

    mapfile -t lines < <(pdc ...)
    

    Для получения данных из массивов:

    for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done
    echo
    printf "%s\n" "${lines[@]}"
    
    33
    22
    11
    
    [okay   ]: you are currently listening: 33
    [okay   ]: you are currently listening: 22
    [okay   ]: you are currently listening: 11
    
    0
    ответ дан 17.05.2020, 17:09
    • 1
      Синтаксическая ошибка: неожиданное перенаправление, когда я использую mapfile -t array < <(grep.....) – UjinT34 17.05.2020, 17:09
    • 2
      Вы используете удар или некоторую другую оболочку? – Max Bunker 17.05.2020, 17:10

    Еще один более интуитивный способ использовать readarray встроенный (см. help -m readarray):

    readarray -t array <<< "$(pdc status -a 2>&1 | grep 'okay')"
    

    затем для печати элемента массива позвольте, говорит второй элемент, можно использовать:

    echo "${array[1]}"
    

    Для печати всех элементов массива на отдельных строках можно использовать:

    printf -- "%s\n" "${array[@]}"
    
    0
    ответ дан 17.05.2020, 17:10

    Теги

    Похожие вопросы