Сценарий массива Bash, комбайн

Doctoror Drive верен, это можно довольно просто сделать с помощью pulseaudio, но если вы используете ALSA исключительно, это будет гораздо более трудная задача.

Для пульса существует множество вариантов. И pacmd , и pactl способны на это, но это может показаться слишком сложным из-за значительного количества опций. В качестве альтернативы вы можете использовать созданный сообществом инструмент под названием ponymix (который сейчас находится в [community]), чтобы очень просто управлять как отдельными потоками приложений, так и общесистемными настройками сервера.

Однако с чистой ALSA я не уверен, возможно ли это вообще.

0
17.01.2019, 13:37
2 ответа

Насколько я понимаю, вы хотите иметь обработанный вывод docker imagesв двух массивах, где каждый элемент массива соответствует строке обработанного вывода.

Этот скрипт не тестировался, потому что я не знаю ни вывода docker images, ни синтаксиса команды для kubectl.

mapfile -t IMG_ARRAY < <(docker images | awk '/dev2/ && /latest/' | awk '{print $1}' | sed ':a;N;$!ba;s/\n/ /g')
mapfile -t IMG_NAME < <(docker images | awk '/dev2/ && /latest/' | awk '{print $1}' | awk -F'/' '{print $3}' | cut -f1 -d"." | sed ':a;N;$!ba;s/\n/ /g')

total=${#IMG_NAME[*]}

for (( i=0; i<$(( $total )); i++ ))
do 
     kubectl set image deployment/$IMG_NAME[$i] $IMG_NAME[$i]=$IMG_ARRAY[$i] --record
     kubectl rollout status deployment/$IMG_NAME[i]
done

См. пояснения вhttps://www.cyberciti.biz/faq/bash-iterate-array/и https://mywiki.wooledge.org/BashFAQ/005.

Вместо

total=${#IMG_NAME[*]}

for (( i=0; i<$(( $total )); i++ ))

вы также можете использовать

for i in ${!IMG_NAME[@]}

см.https://stackoverflow.com/questions/6723426/looping-over-arrays-printing-both-index-and-value

1
28.01.2020, 02:30
declare -a IMG_ARRAY=`...`

Это не создает большую часть массива, все выходные данные подстановки команд назначаются нулевому элементу массива. Фактический синтаксис назначения массива — name=(elem1 elem2 ... ), т. е. со скобками и элементами как отдельными словами.

Вы можете использовать разбиение слов для разделения вывода на элементы, но для этого по-прежнему требуются круглые скобки, а вы подвергаетесь IFSи подстановке. declare -a aaa=( $(echo foo bar) )создает два элемента fooи bar. Обратите внимание, что он разбивается на пробелы между словами, а не только на новые строки.

Использование mapfile/ readarrayздесь, вероятно, лучше, так как это явно сделано для чтения строк в массив. Текст справки командной строки(help mapfile)описывает это:

mapfile: mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
    Read lines from the standard input into an indexed array variable.

    Read lines from the standard input into the indexed array variable ARRAY, or
    from file descriptor FD if the -u option is supplied.  The variable MAPFILE
    is the default ARRAY.
1
28.01.2020, 02:30

Теги

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