Борьба за эквивалентность Bash

Где я ошибаюсь в этом Bash?

      declare current_state=`pacmd list-sources | sed -n 19p`
declare my_target='used by: 0'
echo $current_state = $my_target
if [ '$current_state' = '$my_target' ] ; then
    echo true
    pacmd set-default-sink "alsa_output.pci-0000_0c_00.4.analog-stereo"
    echo true
else
    echo false
    pacmd set-default-sink "alsa_output.pci-0000_0a_00.1.hdmi-stereo-extra2"
    echo false
fi

Он всегда выводит на терминал опцию else (false):

      used by: 0 = used by: 0
false
false

я пыталсяif [[ '$current_state' = '$my_target' ]],if [[ '$current_state' == '$my_target' ]],if [ '$current_state' == '$my_target' ],if [ '$current_state' == 'used by 0:' ],if [ '$current_state' = 'used by 0:' ]и т. д. Это всегда возвращается как ложное.

Для контекста я пытался использовать сценарии из Как переключить вывод звука с помощью сочетания клавиш , но ни один из них не работает, потому что мои индексы вывода равны 2, 3 и 30. Потому что это имеет смысл. Во всяком случае, я обнаружил, запустив список источников pacmd, изменив выбранные вручную выходные данные из различий в настройках звука в нескольких строках. (Строка 6 была тем, что я изначально пробовал, и она сообщала о состоянии одного из индексов 2 (первого, да, первого) какstate: IDLE,state: RUNNING, или жеstate: SUSPENDED.) Мне удалось заставить работать bash-скрипт один раз , чтобы перейти с наушников на монитор, и больше ничего. Итак, я попытался изменить, где я смотрю на этот вывод строки 19, который сообщает мне, используется ли он (я думаю) либо сused by: 1когда активен илиused by: 0когда он неактивен, чтобы просто переключаться. Но нет, не повезло.

Итак, затем я приступаю к основному устранению неполадок, чтобы убедиться, что мой if/else оценивает правильно, а это нет. Я не знаю, что мне здесь делать. Я что-то напутал с декларацией?? Я не знаю.

1 ответ

pacmd list-sourcesобычно приводит к строкам с ведущими пробелами/табуляциями... Это может привести к тому, что две сравниваемые строки будут не равны... Пробелы учитываются.

Вы можете использовать для частичного совпадения, например, попробуйте[ " abc: 1" = "abc: 1" ] && echo "full match" || [[ " abc: 1" =~ "abc: 1" ]] && echo "partial match"... обратите внимание на порядок строк и подстрок вокруг=~и использование[[ ... ]]

Итак, изменив свой код:

      #!/bin/bash

current_state=$(pacmd list-sources | sed -n 19p)
my_target="used by: 0"
echo "$current_state" = "$my_target"
if [[ "$current_state" =~ "$my_target" ]] ; then
    echo true
    pacmd set-default-sink "alsa_output.pci-0000_0c_00.4.analog-stereo"
    echo true
else
    echo false
    pacmd set-default-sink "alsa_output.pci-0000_0a_00.1.hdmi-stereo-extra2"
    echo false
fi
Другие вопросы по тегам