Как установить переключатель для команды bash для linux (True или False)?

В настоящее время я назначил свою кнопку thinkvantage, чтобы отключить касание, чтобы щелкнуть по трекпаду, но я хотел бы преобразовать его в режим включения / выключения.

На данный момент это команда bash, которую я использую, чтобы выключить ее (или включить с помощью CTRL):

gsettings set org.gnome.settings-daemon.peripherals.touchpad tap-to-click true
gsettings set org.gnome.settings-daemon.peripherals.touchpad tap-to-click false

Есть ли способ сделать эту команду переключения? Другими словами, как мне превратить это в условный оператор bash?

3 ответа

Решение

Предположительно что-то вроде этого:

#!/bin/bash
class=org.gnome.settings-daemon.peripherals.touchpad
name=tap-to-click
status=$(gsettings get "$class" "$name")
status=${status,,} # normalize to lower case; this is a modern bash extension
if [[ $status = true ]]; then
  new_status=false
else
  new_status=true
fi
gsettings set "$class" "$name" "$new_status"

Разбивая его на куски:

  • #!/bin/bash гарантирует, что интерпретатором этого сценария является bash, что позволяет использовать расширенный синтаксис, такой как [[ ]],
  • Синтаксис $( ) это "подстановка команд"; это запускает команду и заменяет вывод этой команды. Таким образом, если на выходе true, затем status=$(...) становится status=true,
  • Расширение параметра ${name,,} расширяет содержание name при преобразовании этого содержимого в строчные буквы, и доступно только в более новых версиях bash. Если вы хотите поддержать /bin/sh или более старые выпуски Bash, рассмотрим status=$(printf '%s\n' "$status" | tr '[:upper:]' '[:lower:]') вместо этого, или просто удалите эту строку, если вывод gsettings get всегда всегда строчные
  • Сравнение [[ $status = true ]] опирается на расширение bash [[ ]] (также доступно в других современных оболочках, полученных из ksh), чтобы избежать цитирования. Если вы хотите, чтобы это работало с #!/bin/sh, вы бы использовали [ "$status" = true ] вместо. (Обратите внимание, что == допустимо внутри [[ ]], но не допускается внутри [ ] на чистых оболочках POSIX; Вот почему лучше не использовать его).

Обратите внимание, что пробелы важны в bash! foo = bar, foo= bar а также foo=bar это совершенно разные утверждения, и все три из них делают разные вещи от двух других. Обязательно ознакомьтесь с различиями при копировании из этого примера.

Переключение секунд на часах Ubuntu Unity (напрямую вставляется как команда для связывания клавиш):

bash -c 'gsettings set com.canonical.indicator.datetime show-seconds $(gsettings get com.canonical.indicator.datetime show-seconds | perl -neprint/true/?false:true)'

Для GNOME:

bash -c 'gsettings set org.gnome.desktop.interface clock-show-seconds $(gsettings get org.gnome.desktop.interface clock-show-seconds | perl -neprint/true/?false:true)'

Источник: https://www.commandlinefu.com/commands/view/24256/toggle-the-touchpad-on-or-off

      synclient TouchpadOff=$(synclient -l | grep -q 'TouchpadOff.*1'; echo $?)

или же

      tp=$(synclient -l | grep TouchpadOff | awk '{ print $3 }') && tp=$((tp==0)) && synclient TouchpadOff=$tp
Другие вопросы по тегам