Оператори CASE

Вступ до Bash Scripting

Alex Scriven

Data Scientist

Навіщо потрібні оператори CASE

Оператори CASE можуть бути ефективніші за IF, коли умов багато або вони складні.

Припустімо, ви хочете перевірити такі умови та дії:

  • Якщо файл містить sydney, перемістіть його в каталог /sydney
  • Якщо файл містить melbourne або brisbane, видаліть його
  • Якщо файл містить canberra, перейменуйте його на IMPORTANT_filename, де filename — початкова назва файла
Вступ до Bash Scripting

Складний оператор 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 Scripting

Побудова оператора CASE

  • Почніть з вибору змінної або рядка для зіставлення
    • Можете викликати «оболонку в оболонці» тут!
  • Додайте стільки відповідників і дій, скільки потрібно.
    • Можна використовувати regex для PATTERN, напр., Air* для «починається з Air» або *hat* для «містить hat».
  • Розділяйте шаблон і код дужкою-закриттям та завершуйте команди подвійною крапкою з комою

Базовий формат оператора CASE:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Вступ до Bash Scripting

Побудова оператора CASE

 

  • *) DEFAULT COMMAND;;

    • Зазвичай (але не обов'язково) завершують типовою командою, яка виконується, якщо інші шаблони не збіглися.
  • esac Нарешті, завершальне слово — «esac»

    • Це «case» навпаки!

Базовий формат оператора CASE:

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

*) DEFAULT COMMAND;;
esac
Вступ до Bash Scripting

Від 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 Scripting

Давайте потренуємось!

Вступ до Bash Scripting

Preparing Video For Download...