Строка извлечения от вывода 'pactl' и передачи как переменная к сценарию оболочки

Я пытаюсь записать сценарий, который позволяет мне изменять объем Беспроводной колонки от оболочки. Я могу трудно кодировать значение приемника, и это работает просто великолепно:

#!/usr/bin/env bash
for level in "$@"
do 
pactl set-sink-input-volume 267 $level
done

Я добираюсь эти "267" значение путем выполнения:

pactl list sink-inputs

Который обеспечивает вывод как:

Sink Input #267
    Driver: protocol-native.c
    Owner Module: 10
    Client: 151
    Sink: 7
    Sample Specification: float32le 2ch 44100Hz
    Channel Map: front-left,front-right
⋮

Все, о чем я забочусь, то, что три значения цифры в первой строке помещенного после Входа Приемника #

Как я сказал, если я hardcode, что 267 значений в сценарии, все хорошо работает, пока я не перезапускаю Беспроводную колонку, затем изменения значения.

Есть ли способ, которым я могу извлечь то значение с помощью сценария и передать его как переменную к pactl set-sink-input-volume 267 $level бит сценария?

3
задан 26 September 2018 в 22:38

2 ответа

Существует два способа сделать это. Это все предполагает, что Вы хотите передать одно число сценарию в аргументах и изменить объем первого приемника к аргументу.

Ваш исходный предложенный путь (удаляют echo после проверки, это работает):

#!/bin/bash

pactl list sink-inputs | grep -hPo '^Sink Input #\K\d+ 

Удаляют echo, после того как Вы проверили, что команды, которые были бы выполнены, корректны.

Или, @steeldriver указывает в комментариях вопроса, существует short форма, это быстрее и легче проанализировать (снова, удалить echo):

#!/bin/bash

pactl list short sink-inputs | head -n 1 | awk '{print$1}' | xargs -n 1 -I{} echo pactl set-sink-input-volume "{}" "$1"
| head -n 1 | xargs -n 1 -I{} echo pactl set-sink-input-volume "{}" "$1"

Удаляют echo, после того как Вы проверили, что команды, которые были бы выполнены, корректны.

Или, @steeldriver указывает в комментариях вопроса, существует short форма, это быстрее и легче проанализировать (снова, удалить echo):

#!/bin/bash

pactl list short sink-inputs | head -n 1 | awk '{print$1}' | xargs -n 1 -I{} echo pactl set-sink-input-volume "{}" "$1"
3
ответ дан 1 December 2019 в 15:49

Вероятно, существует лучший способ получить точный импульсный аудио идентификатор, который Вы после, но, так как Вы попросили то, как проанализировать его в рамках сценария удара, здесь идет!

То, что Вы запрашиваете, должно выполнить другую команду удара и получить вывод, как это:

sinkid=$(pactl list sink-inputs | egrep "Sink Input #" | egrep -o [0-9]+)

Разломанный на части:

  • sinkid переменная, которую мы создаем (обратите внимание, что Bash является языком, который не терпит пробелы между x=y в переменных присвоениях)
  • = говорит удару, что мы присваиваемся, это - значение к чему-то
  • $( ... ) средства мы выполняем команду. Можно видеть, что другие используют символ могилы/обратной галочки, но некоторые (самостоятельно включенный) утверждают, что это более ясно.
  • pactl list sink-inputs существующая команда, которую Вы выполняете.
  • | говорит, что мы "передаем вывод по каналу" этого в другую команду
  • grep "Sink Input #" находит строку, которой мы интересуемся
  • | снова передает вывод по каналу, таким образом, мы можем далее обработать его с помощью другой команды grep.
  • egrep -o [0-9]+ находит только число от строки "Sink Input #123 вывод 123 только.

Теперь можно занять место в исходной команде sinkid как это:

pactl set-sink-input-volume "$sinkid" "$level"
1
ответ дан 1 December 2019 в 15:49

Другие вопросы по тегам:

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