Doctoror Drive верен, это можно довольно просто сделать с помощью pulseaudio, но если вы используете ALSA исключительно, это будет гораздо более трудная задача.
Для пульса существует множество вариантов. И pacmd
, и pactl
способны на это, но это может показаться слишком сложным из-за значительного количества опций. В качестве альтернативы вы можете использовать созданный сообществом инструмент под названием ponymix
(который сейчас находится в [community]), чтобы очень просто управлять как отдельными потоками приложений, так и общесистемными настройками сервера.
Однако с чистой ALSA я не уверен, возможно ли это вообще.
Насколько я понимаю, вы хотите иметь обработанный вывод 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
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.