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

В настоящее время я тестирую изменения в своих сценариях для повышения производительности. В частности, я хочу изменить, if к утверждениям case .

Однако, будучи новичком в программировании оболочки, я зацикливаюсь на этом типе утверждения:

 if [ "$A" == "x" -a "$B" == "y" ] then let a=a+1 fi 

Я пробовал это, но это не сработало:

 case "$A$B" in "x""y") let a=a+1 ;; esac 

Что я ошибся?

И возможно ли управлять утверждениями «! =» В случае? Такие как:

 if [ "$A" == "x" -a "$B" != "y" ] then let a=a+1 fi 

2 Solutions collect form web for “Преобразование if в случае”

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

В стандартном test , или [ команда, оператор сравнения = . == работает в некоторых системах, но не во всех. Кроме того, комбинирование условий с использованием -a проблематично, по крайней мере, с такими условиями, как -n . (см. этот вопрос ). Лучше использовать, if [ "$A" = x ] && [ "$B" = y ] ; then ... 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 вместо оболочки, а не просто из-за простых сравнений, а потому, что они позволят вам делать больше, не вызывая внешние программы (например, grep , sed , cut , или jq ). Кроме того, первое правило оптимизации производительности: измерить разницу.

 # $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 
  • Как проверить, нет ли у группы пользователей и удалить их?
  • Как получить доступ к содержимому файла, который используется в качестве аргумента при запуске сценария bash?
  • Перемещение файлов по дате в другую папку с использованием CLI
  • Как запустить несколько «последовательных» процессов под управлением, учитывая доступные процессоры?
  • Структура структуры преобразования
  • Как неинвазивно проверить доступ на запись к файлу?
  • Менее конкретный вход для скрипта
  • Добавить путь к $ PATH, если он еще не был в $ PATH
  • Как я могу подавить вывод только в том случае, если команда выполнена успешно?
  • Установка переменной среды с помощью сценария оболочки
  • Запуск программы (команды) на терминале после экрана входа в Ubuntu 14.04
  • Interesting Posts

    Как ядро ​​Linux знает, когда использовать буфер / кеш памяти?

    Как я могу заставить компьютер запомнить кодовую фразу ключевого слова SSH между перезагрузками?

    Необходимо настроить сетевую карту вручную после каждой перезагрузки

    Переупорядочить файл, чтобы он легко читался

    SSH-сервер не отключает сеанс, когда я выключаю машину

    Я хочу услышать пинг

    получить информацию об обновлении пакета в openSuSE

    Неверная сборка пакетов для правила dnat с использованием iptables

    Как я могу сделать загрузочный flashdrive?

    пути для поиска исполняемых файлов

    Как сопоставить группу 1 в регулярном выражении, за которой следует 0, а не соответствующая группа 10

    Используйте minisat, чтобы найти все решения для SAT

    Где скачать дебианские исторические версии, такие как debian-7.8 или debian6?

    Использует ли linux mint репозитории ubuntu или их собственные репозитории?

    Поддерживает ли OpenSSH> = 7.2 локальное расширение тильды для удаленной пересылки сокетов Unix

    Linux и Unix - лучшая ОС в мире.