Hur man använder fallbeskrivningar i Bash-skript

0
160
Patpitchaya/Shutterstock.com figur>

Bash case-satser är kraftfulla men ändå lätta att skriva. När du återvänder till ett gammalt Linux-skript kommer du att vara glad att du använde en fallsats istället för en lång if-then-else-sats.

Case Statement< /h2>

De flesta programmeringsspråk har sin version av en switch eller case-sats. Dessa styr flödet av programexekvering enligt värdet på en variabel. Vanligtvis finns det en exekveringsgren definierad för vart och ett av de förväntade möjliga värdena för variabeln och en catch-all eller standard gren för alla andra värden.

Den logiska funktionen liknar en lång sekvens av om -sedan uttalanden med en else-sats som fångar allt som inte tidigare har hanterats av en av if-satserna.

RELATERATVad är bashskalet och varför är det så viktigt till Linux?

Bash-implementeringen av fall försöker matcha ett uttryck med en av klausulerna. Det gör det genom att titta på varje klausul i sin tur och försöka hitta ett matchande mönster. Mönster i satser är strängar, men motintuitivt betyder det inte att vi inte kan använda numeriska värden som uttryck.

Det allmänna fallet

Den generiska formen av fallsatsen är denna:

fallet uttryck i   pattern-1)   statement   ;;; mönster-2)   uttalande   ;; . . . mönster-N)   uttalande   ;; *) påstående ;; esac

  • En fallsats måste börja med nyckelordet case och sluta med nyckelordet esac.
  • Uttrycket utvärderas och jämförs med mönstren i varje sats tills en matchning hittas.
  • Satsen eller satserna i matchningssatsen körs.
  • Ett dubbelt semikolon “;;” används för att avsluta en sats.
  • Om ett mönster matchas och satserna i den satsen exekveras, ignoreras alla andra mönster.
  • Det finns ingen gräns för antalet satser.
  • En asterisk “*” anger standardmönstret. Om ett uttryck inte matchas med något av de andra mönstren i case-satsen exekveras standardsatsen.

Ett enkelt exempel

h2>

Det här skriptet talar om öppettiderna för en tänkt butik. Den använder datumkommandot med formatsträngen +”%a” för att få det förkortade dagsnamnet. Detta lagras i variabeln DayName.

#!/bin/bash DayName=$(datum +”%a”) echo “Öppettider för $DayName” fall $DayName i mån) echo “09:00 – 17:30” ;; Tis) echo “09:00 – 17:30” ;; ons) echo “09:00 – 12:30” ;; Tors) echo “09:00 – 17:30” ;; fre) echo “09:00 – 16:00” ;; lör) echo “09:30 – 16:00” ;; Sun) echo “Stängt hela dagen” ;; *) ;; esac Annons

Kopiera den texten till en redigerare och spara den som en fil som heter “open.sh.”

Vi måste använda chmod kommando för att göra det körbart. Du måste göra det för alla skript du skapar när du arbetar igenom den här artikeln.

chmod +x open.sh

Vi kan nu köra vårt skript.

./open.sh

Dagen då skärmdumpen togs råkar vara en fredag. Det betyder att DayName-variabeln innehåller strängen “Fre.” Detta matchas med “Fre” mönster av “fre)” sats.

Observera att mönstren i satserna inte behöver lindas in i dubbla citattecken, men det skadar inte om de är det. Du måste dock använda dubbla citattecken om mönstret innehåller mellanslag.

Standardsatsen har lämnats tom. Allt som inte matchar någon av de föregående satserna ignoreras.

Det skriptet fungerar och det är lätt att läsa, men det är långrandigt och repetitivt. Vi kan förkorta den typen av case-påstående ganska enkelt.

RELATERAT: Hur man använder kommandot chmod på Linux

Använda flera mönster i en klausul

En riktigt snygg funktion i falluttalanden är att du kan använda flera mönster i varje klausul. Om uttrycket matchar något av dessa mönster exekveras satserna i den satsen.

Annons

Här är ett skript som talar om hur många dagar det är i en månad. Det kan bara finnas tre svar: 30 dagar, 31 dagar eller 28 eller 29 dagar för februari. Så även om det finns 12 månader behöver vi bara tre satser.

I det här skriptet uppmanas användaren att ange namnet på en månad. För att göra mönstermatchningen skiftlägesokänslig använder vi kommandot shopt med alternativet -s nocasematch. Det spelar ingen roll om inmatningen innehåller versaler, gemener eller en blandning av de två.

#!/bin/bash shopt -s nocasematch echo “Ange namn på en månad” läs månad skiftläge $month in februari) echo “28/29 dagar i $månad” ;; april | juni | september | november) echo “30 dagar i $månad” ;; januari | mars | maj | juli | augusti | oktober | December) echo “31 dagar i $månad” ;; *) echo “Okänd månad: $month” ;; esac

Februari får en klausul för sig själv, och alla andra månader delar två klausuler beroende på om de har 30 eller 31 dagar i sig. Flermönsterklausuler använder rörsymbolen “|” som avskiljare. Standardfallet fångar dåligt stavade månader.

Vi sparade detta i en fil som heter “month.sh” och gjorde det körbart.

chmod +x month.sh

Vi kör skriptet flera gånger och visar att det inte spelar någon roll om vi använder versaler eller gemener.

./month.sh

Annons

Eftersom vi sa till skriptet att ignorera skillnader i versaler och gemener, hanteras varje månadsnamn som är korrekt stavat av en av de tre huvudsatserna. Dåligt stavade månader fångas upp av standardsatsen.

Använda siffror i fallutlåtanden

Vi kan också använda siffror eller numeriska variabler som uttryck. Detta skript ber användaren att ange ett nummer i intervallet 1…3. För att göra det tydligt att mönstren i varje sats är strängar, har de lindats in i dubbla citattecken. Trots detta matchar skriptet fortfarande användarens inmatning med lämplig sats.

#!/bin/bash echo “Ange 1, 2 eller 3: ” read Number case $Number in “1”) echo “Klausul 1 matchade” ;; “2”) echo “Klausul 2 matchade” ;; “3”) echo “Klausul 3 matchade” ;; *) echo “Standardsats matchad” ;; esac

Spara detta i en fil som heter “number.sh”, gör den körbar och kör den sedan:

./number.sh

Använda case-satser i för loopar

En case-sats försöker mönstra ett enstaka uttryck. Om du har många uttryck att bearbeta kan du lägga fallsatsen i en for-loop.

Det här skriptet kör kommandot ls för att få en lista över filer. I for-slingan tillämpas filglobing—liknande men olika för reguljära uttryck—på varje fil i sin tur för att extrahera filtillägget. Detta lagras i strängvariabeln Extension.

Annons

Kasussatsen använder Extension-variabeln som uttrycket den försöker matcha till en sats.

#!/bin/bash för File i $(ls) do # extrahera filtillägget Extension=${File##*. } case “$Extension” i sh) echo ” Shell script: $File” ;; md) echo “Markdown-fil: $File” ;; png) echo “PNG-bildfil: $File” ;; *) echo “Okänd: $File” ;; esac klar

Spara den här texten i en fil som heter “filetype.sh”, gör den körbar och kör den sedan med:

./filetype.sh

Vårt minimalistiska filtypsidentifieringsskript fungerar.

RELATED: Hur man använder “Here Documents” i Bash på Linux

Hantera utgångskoder med ärendeuttalanden

Ett väluppfostrat program skickar en utgångskod till skalet när det avslutas. Det konventionella schemat använder ett utgångskodvärde på noll för att indikera en problemfri exekvering, och värden på ett eller flera för att indikera olika typer av fel.

Många program använder bara noll och ett. Att samla alla feltillstånd i en enda utgångskod gör det svårare att identifiera problem, men det är vanligt.

RELATERATHur man arbetar med variabler i Bash

Vi skapade ett litet program som heter “go-geek” som slumpmässigt skulle returnera utgångskoder på noll eller ett. Detta nästa manus kallar go-geek. Den hämtar utgångskoden med hjälp av $? skalvariabel och använder den som uttryck för case-satsen.

Ett verkligt skript skulle göra lämplig bearbetning beroende på om kommandot som genererade utgångskoden lyckades eller misslyckades.

#! /bin/bash go-geek case $? i “0”) echo “Response was: Success” echo “Gör lämplig bearbetning här” ;; “1”) echo “Response was: Error” echo “Gör lämplig felhantering här” ;; *) echo “Oigenkänt svar: $?” ;; esac

Spara detta i ett skript som heter “return-code.sh” och gör det körbart. Du måste ersätta vårt go-geek-kommando med något annat kommando. Du kan försöka att cd till en katalog som inte existerar för att få en utgångskod för en, och sedan redigera ditt skript till cd till en tillgänglig katalog för att få en utgångskod på noll.

Annons

Om man kör skriptet några gånger visar det att de olika exitkoderna identifieras korrekt av case-satsen.

./return-code.sh

Läsbarhet hjälper till att underhålla

Återgå tillbaka till gamla Bash-manus och att ta reda på hur de gör vad de gör, särskilt om de skrevs av någon annan, är en utmaning. Det är ännu svårare att ändra funktionaliteten hos gamla skript.

Case-satsen ger dig förgrenad logik med tydlig och enkel syntax. Det är en win-win.

RELATERAT: Hur man installerar och använder Linux Bash Shell på Windows 10

LÄS NÄSTA

  • › PSA: Bedragare använder chipsbristen för att lura människor
  • › Sluta stänga appar på din Android-telefon
  • › Köpa en begagnad Mac eller MacBook? Kontrollera dessa saker innan du köper
  • › Vad är MIL-SPEC Drop Protection?
  • › 5 psykologiska knep i gratis-att-spela-spel (och hur man undviker dem)
  • › Windows 11 vs. Chrome OS: Vilket är bäst för Android-appar?