Преобразование оператора if в случае

Большинство звуковых карт (вы не сказали, какие из них у вас установлены) позволяют полностью отключить звук в ALSA, отключив "Master" или аналогичное управление микшером.Большинство дистрибутивов (вы не сказали, какой из них используете) позволяют загружать настройки ALSA по умолчанию на сравнительно ранней стадии процесса загрузки (например, alsa-utils в Debian), и это должно заглушать звук перед тем, как приложение действительно хочет воспроизводить любой звук таким образом.

Если вы также хотите отключить внутренний динамик ПК, это немного сложнее: я бы, вероятно, попытался внести в черный список модуль pcspkr , но я не уверен, работает ли это.

Обе эти модификации не должны перезаписываться обновлениями пакетов.

1
22.03.2017, 16:33
2 ответа

Ваш пример case мне подходит, но обратите внимание, что вы сравниваете конкатенацию из A и B, поэтому шаблон будет соответствовать и в том случае, если, скажем, A будет xy, а B будет пустым. (Я думаю, что двойные кавычки в середине лишние). case берет только одно слово для сравнения с шаблонами, поэтому вы не можете сравнивать несколько переменных, кроме как путем конкатенации.

В стандартной команде test, или [, оператором сравнения является =. == работает в некоторых системах, но не во всех. Кроме того, объединение условий с помощью -a проблематично, по крайней мере, с условиями типа -n. (см. этот вопрос). Лучше использовать if [ "$A" = x ] && [ "$B" = y ] ; then ... .

Что касается инвертирования case, вам нужно придумать шаблон, который соответствует всему, кроме целевой строки. extglob в Bash и других позволяет искать соответствие всему, кроме:

case $B in !(y) ) echo not y ;; esac

Без него вам придется проделать дополнительную работу по инвертированию шаблона, или использовать несколько шаблонов, первые из которых будут соответствовать строке, а последующие по умолчанию будут выполнять фактическое действие.

case $B in ??*) echo not y ;; [^y]) echo also not y ;; esac

case $B in y) ;; *) echo still not y ;; esac

(никаких гарантий, особенно в первом случае. Честно говоря, вся идея делать это кажется ужасной.)

В любом случае, поскольку вы упомянули о причинах производительности, вы можете рассмотреть возможность перехода на Perl или Python вместо shell, не столько из-за простых сравнений, сколько потому, что они позволят вам делать больше без вызова внешних программ (таких как grep, sed, cut или jq). Кроме того, первое правило оптимизации производительности: измерьте разницу.

2
27.01.2020, 23:34
#  $A = "x" && $B = "y"
case ${A:--}/${B:--} in 'x/y' ) let a=a+1;; esac

# $A = "x" && $B != "y"
case $A in 'x' ) case $B in '' | ??* | [!y] ) let a=a+1;; esac;; esac
0
27.01.2020, 23:34

Теги

Похожие вопросы