GNU/Linux >> Znalost Linux >  >> Linux

Skriptování prostředí 3. část:Struktury řízení rozhodování ve skriptech prostředí

Ahoj! Základy skriptování shellu, jako je přijímání vstupů, zpracování dat pomocí aritmetických operací a generování a zobrazování výstupu, jsme již probrali v předchozích částech tohoto tutoriálu (část 1 a část 2). V této části půjdeme hlouběji k pokročilejšímu tématu v programovacím jazyce -- rozhodování v programu, ale tentokrát to uděláme pomocí bash shellu. Začněme!

Úvod

Většina našich dnešních programovacích jazyků je schopna se rozhodovat na základě námi stanovených podmínek. Podmínka je výraz, který se vyhodnotí jako logická hodnota – pravda nebo nepravda. Každý programátor může udělat svůj program chytrým na základě rozhodnutí a logiky, kterou do svého programu vloží. Shell bash podporuje příkazy if a switch (case).

Příkaz If

If je příkaz, který umožňuje programátorovi rozhodnout se v programu na základě podmínek, které zadal. Pokud je podmínka splněna, program provede určité řádky kódu, jinak program provede jiné úlohy, které programátor zadal. Níže je uvedena podporovaná syntaxe příkazu if v prostředí bash.

Obecná syntaxe

Jediné rozhodnutí:

if <condition>
then
    ### series of code goes here
fi

Dvojité rozhodnutí:

if <condition>
then
    ### series of code if the condition is satisfied
else
    ### series of code if the condition is not satisfied
fi

Vícenásobná podmínka if:

if <condition1>
then
    ### series of code for condition1
elif <condition2>
then
    ### series of code for condition2
else
    ### series of code if the condition is not satisfied
fi

Syntaxe s jednou závorkou

if [ condition ]
then
    ### series of code goes here
fi

Syntaxe se dvěma závorkami

if ((condition))
then
    ### series of code goes here
fi

Syntaxe s jednou závorkou je nejstarší podporovaná syntaxe v bash shellu. Používá se společně se všemi podmíněnými příkazy v Linuxu. Mezitím se syntaxe s dvojitými závorkami používá pro podmíněný příkaz založený na číslech, který poskytuje programátorům známou syntaxi. Všechny typy příkazů if potřebují k provedení úlohy určitou podmínku.

Podmíněné příkazy v Linuxu

Podmíněné příkazy se používají společně s příkazem kontroly rozhodování. V bash shellu můžete použít různé typy podmíněných příkazů, nejběžnější jsou:souborové, řetězcové a aritmetické podmínky.

Podmínka založená na souboru

Podmínky založené na souboru jsou unární výrazy a často se používají ke zkoumání stavu souboru. Následující seznam ukazuje nejběžněji používané podmínky založené na souborech v prostředí bash.

Operátor Popis
-soubor Vrátí hodnotu true, pokud soubor existuje
soubor -b Vrátí hodnotu true, pokud soubor existuje a jedná se o speciální blokový soubor
-c soubor Vrátí hodnotu true, pokud soubor existuje a jedná se o speciální znakový soubor
soubor -d Vrátí hodnotu true, pokud soubor existuje a jedná se o adresář
-e soubor Vrátí hodnotu true, pokud soubor existuje
soubor -r Vrátí hodnotu true, pokud soubor existuje a je čitelný
soubor -s Vrátí hodnotu true, pokud soubor existuje a má větší velikost než nula
soubor -s Vrátí hodnotu true, pokud soubor existuje a má větší velikost než nula
soubor -w Vrátí hodnotu true, pokud soubor existuje a je možné do něj zapisovat
-x soubor Vrátí hodnotu true, pokud soubor existuje a je spustitelný
-N soubor Vrátí hodnotu true, pokud soubor existuje a byl od posledního přečtení změněn

Rozhodování na základě souboru

Uveďme příklad, který bude ilustrovat, jak vytvořit rozhodnutí založené na souboru ve skriptu bash. V tomto příkladu vytvoříme skript, který určí, zda soubor existuje v domovském adresáři.

#!/bin/bash

cd
ls
if [ -e sample.sh ]
then
    echo "file exists!"
else
    echo "file does not exist"
fi

V tomto příkladu jsme pomocí příkazu cd zajistili, že se shell vrátí do domovského adresáře bez ohledu na náš aktuální aktivní adresář. Příkaz ls se navíc používá k zobrazení seznamu souborů v adresáři, abychom mohli ověřit, zda soubor skutečně existuje nebo ne. Jak můžete vidět, skript vypíše text "soubor existuje!" protože sample.sh je v domovském adresáři.

Note: The shell compiler is very strict in terms of syntax especially with spaces. There should be a space between if and the open bracket and in between brackets and the condition.

Nyní vylepšeme náš skript tím, že uděláme náš kód dynamičtějším tím, že umožníme uživateli zadat název skriptu a určit oprávnění daného souboru.

#!/bin/bash

cd
ls -l
read -p "Enter a file name: " filename
if [ -e $filename ]
then
    echo "file exists!"
    if [ -r $filename ]
    then
         status="readable "
    fi
    if [ -w $filename ]
    then
         status=$status"writable "
    fi
    if [ -x $filename ]
    then
         status=$status"executable"
    fi
     echo "file permission: "$status
else
    echo "file does not exist"
fi

Podmínka založená na řetězci

Rozhodování na základě zadání řetězce uživatelem je také možné v bash shellu. Řetězcová podmínka vrací jako výsledek binární výraz, vrací true, pokud je zadaná podmínka splněna jinak, vrací false. Následují běžně používané podmíněné operátory založené na řetězcích:

Operátor Popis
== Vrátí hodnotu true, pokud jsou řetězce stejné
!= Vrátí hodnotu true, pokud se řetězce neshodují
-n Vrátí hodnotu true, pokud testovaný řetězec není null
-z Vrátí hodnotu true, pokud je testovaný řetězec null

Vytvořme ukázkový skript pomocí podmíněného příkazu založeného na řetězcích. Skript umožní uživateli zadat dva řetězce a posoudit, zda je jeden z řetězců prázdný, oba řetězce jsou stejné a různé.

#!/bin/bash 

read -p "First String: " str1
read -p "Second String: " str2
if [ -z "$str1" ]
then
    echo "The 1st string is null"
elif [ -z "$str2" ]
then
    echo "The 2nd string is null"
else
    if [ $str1 == $str2 ]
    then
         echo "The strings are equal"
    else
        echo "The strings are not equal"
    fi
fi

Podmínka založená na aritmetice

Shell poskytuje několik způsobů, jak deklarovat podmínku založenou na aritmetice. První je pomocí mnemotechnických pomůcek, které lze použít společně se starou syntaxí s jednoduchými závorkami, a druhou pomocí matematicky vhodných symbolů, které lze použít společně s dvojitou závorkou

Níže je seznam dostupných mnemotechnických pomůcek pro aritmeticky založené podmíněné příkazy v shellu:

Operátor Použití/Popis
-eq Rovno
-ge Větší než nebo rovno
-gt Větší než
-le Menší než nebo rovno
-lt Méně než
-ne Nerovná se

Vytvořme skript, který přijme celé číslo od uživatele a určí, zda je celé číslo nula, záporné, liché nebo sudé číslo.

#!/bin/bash 

read -p "Enter an integer: " int1
if [ $int1 -eq 0 ]
then
    echo "Zero"
elif [ $int1 -lt 0 ]
then
    echo "Negative"
else
    if [ $((int1%2)) -eq 0 ]
    then
        echo "Even"
    else
        echo "Odd"
    fi
fi

Aritmetický operátor pro syntaxi dvojitých závorek:

Operátor Použití/Popis
== Rovno
>= Větší než nebo rovno
> Větší než
<= Menší než nebo rovno
< Méně než
!= Nerovná se

Nyní zrekonstruujeme náš předchozí skript a použijeme syntaxi dvojitých závorek:

#!/bin/bash

read -p "Enter an integer: " int1
if (( $int1 == 0 ))
then
    echo "Zero"
elif (( $int1 < 0 ))
then
    echo "Negative"
else
    if (( $((int1%2)) == 0 ))
    then
        echo "Even"
    else
        echo "Odd"
    fi
fi

Příkaz přepínače

Příkaz switch je dalším druhem podmíněného příkazu ve skriptování shellu. Umožňuje programátorovi porovnat několik hodnot s proměnnou snáze ve srovnání s podmíněným příkazem if. Syntaxe příkazu switch je:


case in
<pattern1>)
    ##series of code for pattern1
    ;;
<pattern2>)
    ##series of code for pattern2
    ;;
<patternN>)
    ##series of code for patternN
    ;;
*)
    ##default statements
esac

Vzor je možná hodnota proměnné. Každý vzor je oddělen dvojitým středníkem, který slouží jako příkaz přerušení vzoru. Příkaz switch je ukončen příkazem esac.

#!/bin/bash 
clear
read -p "Integer1: " int1
read -p "Integer2: " int2
echo "======================"
printf "Menu: \n[a] Addition\n[b]Subtraction\n[c]Multiplication\n[d]Division\n"
echo "======================"
read -p "Your choice: " choice
res=0
case $choice in
a)
    res=$((int1+int2))
;;
b)
    res=$((int1-int2))
;;
c)
    res=$((int1*int2))
;;
d)
    res=$((int1/int2))
;;
*)
    echo "Invalid input"
esac
echo "The result is: " $res

Závěr

Bash shell poskytuje mnoho užitečných nástrojů pro programátory. Stejně jako většina dnešních programovacích jazyků je také schopen provádět podmíněná rozhodnutí, díky nimž jsou skripty shellu interaktivnější a chytřejší. V příští sérii představíme opakující se strukturu ovládání. 'Až příště.

Odkazy

  • http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
  • https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/

Další lekce: Struktury řízení opakování


Linux
  1. Správné zamykání skriptů Shell?

  2. Deskriptory souborů a skriptování prostředí?

  3. Rozšíření souborů pro skripty Unix Shell?

  1. Asociativní pole ve skriptech Shell?

  2. Třídit část souboru?

  3. Zjistěte, zda soubor existuje nebo ne v HDFS pomocí skriptu shellu

  1. Shell Scripting Část V:Funkce v Bash

  2. přesunout pouze v případě, že soubor existuje ve skriptu shellu

  3. Jak odstranit jakýkoli řetězec ze souboru pomocí skriptů shellu?