CASE-satser

Introduktion till Bash-skriptning

Alex Scriven

Data Scientist

Varför CASE-satser behövs

CASE-satser kan vara mer optimala än IF-satser när du har flera eller komplexa villkor.

Säg att du vill testa följande villkor och åtgärder:

  • Om en fil innehåller sydney – flytta den till katalogen /sydney
  • Om en fil innehåller melbourne eller brisbane – ta bort den
  • Om en fil innehåller canberra – byt namn till IMPORTANT_filename där filename är det ursprungliga filnamnet
Introduktion till Bash-skriptning

En komplex IF-sats

Du kan konstruera flera IF-satser så här:

  • Koden anropar grep på det första ARGV-argumentet för villkoret.
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
  • Känns det komplext och upprepande?
Introduktion till Bash-skriptning

Bygg en CASE-sats

  • Börja med att välja vilken variabel eller sträng som ska matchas
    • Du kan använda skal-i-skal här!
  • Lägg till valfritt antal mönster och åtgärder.
    • Du kan använda regex för PATTERN, till exempel Air* för "börjar med Air" eller *hat* för "innehåller hat".
  • Separera mönster och kommando med en avslutande parentes och avsluta kommandon med dubbelt semikolon

Grundläggande format för CASE-satser:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Introduktion till Bash-skriptning

Bygg en CASE-sats

 

  • *) DEFAULT COMMAND;;

    • Det är vanligt (men inte obligatoriskt) att avsluta med ett standardkommando som körs om inget annat mönster matchar.
  • esac Avslutningsordet är "esac"

    • Det är "case" baklänges!

Grundläggande format för CASE-satser:

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

*) DEFAULT COMMAND;;
esac
Introduktion till Bash-skriptning

Från IF till CASE

Vår gamla IF-sats:

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

Vår nya CASE-sats:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Introduktion till Bash-skriptning

Nu kör vi en övning!

Introduktion till Bash-skriptning

Preparing Video For Download...