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 отслеживать, в каких местах безопасно оставлять двойные кавычки, а когда это небезопасно - слишком много проблем. (Левая сторона = сравнение внутри [[ ]] является одним из безопасных мест, но с правой стороны нет, и в [ ] это почти никогда не безопасно - удачи, помня все это правильно!) Поэтому я предпочитаю просто всегда использовать двойные кавычки.

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