bash: сравнение строк с проблемой grep-переменной
Баш-новичок здесь.
Я хочу использовать следующий простой сценарий в качестве ярлыка для включения / отключения сенсорной панели моего ноутбука:
#!/bin/bash
result=$(xinput --list-props 11 | grep "Device Enabled")
echo $result
# Output: Device Enabled (140): 1
if [[ "$result" = "Device Enabled (140): 1" ]]; then
`xinput set-prop 11 "Device Enabled" 0`
else
`xinput set-prop 11 "Device Enabled" 1`
fi
Однако условие if никогда не вводится. echo $result
показывает, что переменная действительно содержит строковое значение, которое я хочу сравнить. Я долго искал, но никак не могу понять, почему переменная результата и строка не совпадают в условии if.
2 ответа
Строка, полученная с помощью grep, в начале имеет вкладку, которую нужно было включить в сравниваемую строку. Проверка снова с echo "$result"
(с добавленными кавычками) помогло.
В Bash (но не более базовых оболочек), вы можете использовать [[ ]]
возможности сопоставления с образцом, чтобы проверить, содержит ли строка образец; использование этого способа избавляет от необходимости беспокоиться о ведущих вкладках, или даже необходимости использовать grep
выбрать соответствующую строку:
if [[ "$(xinput --list-props 11 | grep "Device Enabled")" = *"Device Enabled (140): 1"* ]]; then
Обратите внимание, что *
s в начале и конце шаблона означает "предшествует чему-либо" и "сопровождается чем-либо" соответственно.
Кроме того, двойные кавычки вокруг $(xinput ...)
здесь на самом деле нет необходимости, но IMO отслеживать, в каких местах безопасно оставлять двойные кавычки, а когда это небезопасно - слишком много проблем. (Левая сторона =
сравнение внутри [[ ]]
является одним из безопасных мест, но с правой стороны нет, и в [ ]
это почти никогда не безопасно - удачи, помня все это правильно!) Поэтому я предпочитаю просто всегда использовать двойные кавычки.