Instrukcje CASE

Wprowadzenie do skryptów Bash

Alex Scriven

Data Scientist

Po co używać instrukcji CASE

Instrukcje CASE mogą być wydajniejsze niż IF przy wielu lub złożonych warunkach.

Załóżmy, że chcemy sprawdzić następujące warunki i działania:

  • Jeśli plik zawiera sydney — przenieść go do katalogu /sydney
  • Jeśli plik zawiera melbourne lub brisbane — usunąć go
  • Jeśli plik zawiera canberra — zmienić jego nazwę na IMPORTANT_filename, gdzie filename to oryginalna nazwa
Wprowadzenie do skryptów Bash

Złożona instrukcja IF

Można użyć wielu instrukcji IF:

  • Ten kod wywołuje grep na pierwszym argumencie ARGV jako warunku.
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
  • Wydaje się to złożone i powtarzalne, prawda?
Wprowadzenie do skryptów Bash

Budowanie instrukcji CASE

  • Najpierw wskazujemy zmienną lub ciąg do dopasowania
    • Można tu użyć powłoki zagnieżdżonej!
  • Dodajemy dowolną liczbę wzorców i działań.
    • W polu PATTERN można używać wyrażeń regularnych, np. Air* dla „zaczyna się od Air" lub *hat* dla „zawiera hat".
  • Wzorzec i polecenie oddzielamy nawiasem zamykającym, a polecenia kończymy podwójnym średnikiem

Podstawowy format instrukcji CASE:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Wprowadzenie do skryptów Bash

Budowanie instrukcji CASE

 

  • *) DEFAULT COMMAND;;

    • Powszechną praktyką (choć nieobowiązkową) jest dodanie domyślnego polecenia wykonywanego, gdy żaden wzorzec nie pasuje.
  • esac — słowo kończące instrukcję

    • To słowo „case" napisane wspak!

Podstawowy format instrukcji CASE:

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

*) DEFAULT COMMAND;;
esac
Wprowadzenie do skryptów Bash

Od IF do CASE

Poprzednia instrukcja 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

Nowa instrukcja CASE:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Wprowadzenie do skryptów Bash

Czas na ćwiczenia!

Wprowadzenie do skryptów Bash

Preparing Video For Download...