GNU/Linux >> Znalost Linux >  >> Linux

Použití případových prohlášení v Bash

Při psaní skriptů Bash je běžné porovnávat řetězec s proměnnou a poté provést něco na základě toho, co bylo zadáno.

Zvažte následující skript. Zkontroluje první argument, který uživatel zadá, a provede různé věci v závislosti na tom, co bylo zadáno:

#!/usr/bin/env bash
if [[ "${1}" == "" ]]; then
	echo "No shape was specified."

elif [[ "${1}" == "square" ]]; then
	echo "You specified 'square'."

elif [[ "${1}" == "circle" ]]; then
	echo "You specified 'circle'."

elif [[ "${1}" == "triangle" ]]; then
	"You specified 'triangle'." 
    
else
	echo "Unknown shape '${1}'."
    exit 1

fi

To ukazuje, i když bez funkce, jednoduchý úkol, který může zopakovat známý tvar zpět uživateli, nebo pokud je tvar neznámý, zobrazí chybovou zprávu.

V tomto je vše v pořádku a šmrncovní a vše funguje podle očekávání. Ale podívejte se, kolik řádků to zabralo. Podívejte se, jak musíte zacházet s každou jednotlivou možností, kterou uživatel projde elif prohlášení?

Nyní má tento program ještě více možností, řekněme 20. Se současným přístupem budete psát if příkaz s 20 elif sekce uvnitř.

Jo, z větší části si to asi budete moci přečíst. Ale je neohrabaný, zabírá příliš mnoho místa, a co je nejdůležitější, existuje lepší alternativa.

Představení případu v Bash

Zde přichází na řadu příkazy typu case. Mohou výrazně snížit počet řádků kódu, které potřebujete pro kontrolu věcí, ve srovnání s if prohlášení.

Totéž if příkaz, který jste použili ke kontrole poskytnutých možností, lze přepsat takto uvnitř případu jedna:

#!/usr/bin/env bash
case "${1}" in
	"")         echo "No option was specified."; exit 1 ;;
    square)     echo "You specified 'square'." ;;
    circle)     echo "You specified 'circle'." ;;
    triangle)   echo "You specified 'triangle'." ;;
    *)          echo "Unknown shape '${1}'."; exit 1 ;;
esac

Podívejte se, jak to vypadá jednodušeji a organizovaněji. To je 12 řádků kódu v if a pouze 7 v case jeden. A čím více možností povolíte, tím razantnější bude tento rozdíl.

A to je případ case prohlášení září. Zatímco oba jsou zcela čitelné, zvláště při malém množství, case prohlášení jednoduše činí vše čistším a dlouhodobě udržitelnějším.

Jak vytvoříte prohlášení o případu v Bash?

Případová prohlášení jsou docela jednoduchá na pochopení s trochou praxe. Zde jsou základní informace o tom, co se děje:

První řádek, který jste viděli, byl case ${1} in . ${1} dává řetězec, proti kterému se bude kontrolovat, zde je první argument předaný skriptu.

Zvažte například tento případ:

case linux in
    windows)    echo "windows" ;;
    macos)      echo "macos" ;;
    linux)      echo "linux" ;;
esac

V tomto příkladu vždy poběží echo "linux" . case *string* in part jednoduše specifikuje, proti jakému řetězci budete kontrolovat, a pak možnosti pod ním spustí příkazy, kdykoli bude nalezena shoda.

Dále začnete specifikovat své možnosti. Pamatujte, že jste měli "" , square , circle , triangle a * jako možnosti ve vašem prvním skriptu.

Výpisy případů jsou kontrolovány shora dolů a spouštějí se pouze při první shodě. Zvažte následující příklad:

case linux in
	linux)      echo "linux" ;;
    windows)    echo "windows" ;;
    linux)      echo "linux 2.0" ;;
esac

Zde by jediný příkaz, který by se spustil, byl echo "linux" . Druhá shoda by pak byla přeskočena, protože již byla nalezena shoda.

Každý řádek v příkazu case musí také končit ;; . To znamená konec seznamu příkazů pro volbu a že by neměly být zpracovávány žádné další příkazy.

Argumenty jsou uvedeny v příkazu case (linux) a windows) části také podporují zástupné znaky. Tedy zadáním něčeho jako linu*) by odpovídaly oběma linux a linus .

Nakonec ukončíte prohlášení případu pomocí esac . Díky tomu bude vědět, že jste uvedli vše, co chcete zpracovat, například done by udělal v for nebo while smyčka.

Chcete-li si zapamatovat klíčové slovo pro dokončení případové zprávy, stačí si zapamatovat esac je case pozpátku.

Případy v praxi – kontroly argumentů

Častým používáním příkazů case v mém vlastním programování je kontrola se seznamem argumentů.

Řekněme, že povolujete poskytování následujících možností vašemu programu:

  • --vertical
  • --add-txt
  • --replace
  • --verify

Chcete-li to zkontrolovat v prohlášení o případu, můžete použít něco takového:

while [[ "${1}" != "" ]]; do
	case "${1}" in
    	--vertical)    verticle="true" ;;
        --add-txt)     add_txt="true" ;;
        --replace)     replace="true" ;;
        --verify)      verify="true" ;;
    esac
    
    shift 1
done

Toto spustí while smyčka while ${1} (první argument daný skriptu) není prázdný. Poté provede kontrolu se seznamem argumentů a přiřadí proměnné, když je nastavena poskytnutá možnost.

Po kontrole s příkazem case se spustí shift 1 , což způsobí hodnotu ${2} (druhý argument poskytnutý skriptu) pro přesun na hodnotu ${1} a zopakuje to s novým ${1} (což bylo dříve ${2} ) do ${1} není nastaveno na nic.

A je to! To jsou všechny základy používání případových příkazů.

Zabalení

Příkazy Case vám mohou pomoci psát kód rychleji a efektivněji. Pomáhají také dělat věci čitelnějšími a udržitelnějšími z dlouhodobého hlediska.

Pokud jste v Bash noví, můžete se naučit základy Bash od nuly v naší Bash Beginner Series.

Máte nějaké otázky nebo něco nefunguje správně? Neváhejte a zanechte komentář níže a já se pokusím co nejlépe odpovědět!


Linux
  1. Použití Bash pro automatizaci

  2. Bash Beginner Series #9:Použití funkcí v Bash

  3. Rozdělit výstup příkazu podle sloupců pomocí Bash?

  1. Pole v Bash nenalezeno

  2. Použití výstupu předchozích příkazů v bash

  3. Bash/sh příkaz „jestli je to jinak“.

  1. How To Echo A Bang!?

  2. Používáte export v .bashrc?

  3. Použití Linux Sleep Command ve skriptech Bash