Борьба за эквивалентность 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