Операторы CASE

Введение в Bash-скриптинг

Alex Scriven

Data Scientist

Зачем нужны операторы CASE

Операторы CASE удобнее операторов IF при наличии нескольких сложных условий.

Предположим, нужно проверить следующие условия:

  • Если файл содержит sydney — переместить его в каталог /sydney
  • Если файл содержит melbourne или brisbane — удалить его
  • Если файл содержит canberra — переименовать в IMPORTANT_filename, где filename — исходное имя файла
Введение в Bash-скриптинг

Сложный оператор IF

Можно написать несколько операторов IF:

  • Этот код вызывает grep для первого аргумента ARGV в условии.
if grep -q 'sydney' $1; then
    mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi
if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi
  • Выглядит громоздко и повторяется, не правда ли?
Введение в Bash-скриптинг

Создание оператора CASE

  • Сначала укажите переменную или строку для сопоставления
    • Здесь можно использовать вложенную оболочку!
  • Добавьте столько шаблонов и действий, сколько нужно.
    • В поле PATTERN можно использовать регулярные выражения: например, Air* — «начинается с Air», *hat* — «содержит hat».
  • После шаблона ставьте закрывающую скобку, а команды завершайте двойной точкой с запятой

Базовый синтаксис оператора CASE:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Введение в Bash-скриптинг

Создание оператора CASE

 

  • *) DEFAULT COMMAND;;

    • Обычно (но не обязательно) в конце добавляют команду по умолчанию, которая выполняется, если ни один шаблон не совпал.
  • esac — завершающее слово оператора

    • Это слово «case», написанное наоборот!

Базовый синтаксис оператора CASE:

case 'STRING' in
  PATTERN1)
  COMMAND1;;
  PATTERN2)
  COMMAND2;;

*) DEFAULT COMMAND;;
esac
Введение в Bash-скриптинг

От IF к CASE

Прежний оператор IF:

if grep -q 'sydney' $1; then
    mv $1 sydney/
fi

if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi

if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi

Новый оператор CASE:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Введение в Bash-скриптинг

Давайте потренируемся!

Введение в Bash-скриптинг

Preparing Video For Download...