GNU/Linux >> Znalost Linux >  >> Linux

Výukový program pro skriptování shellu krok za krokem

V tomto tutoriálu budeme hovořit o skriptování shellu a o tom, jak vytvořit svůj první skript shell. Obecně se jim říká skripty shellu, ale budeme je nazývat skripty Bash, protože mezi ostatními shelly Linuxu budeme používat Bash.

Existují zsh, tcsh, ksh a další shelly.

V předchozích příspěvcích jsme viděli, jak používat shell Bash a jak používat příkazy Linuxu.

Koncept Bash skriptu je spouštět řadu příkazů, aby byla vaše práce hotová.

Chcete-li spustit více příkazů v jednom kroku z shellu, můžete je napsat na jeden řádek a oddělit je středníkem.

pwd ; whoami

Toto je Bash skript!!

Nejprve se spustí příkaz pwd, který zobrazí aktuální pracovní adresář, poté se spustí příkaz whoami, který zobrazí aktuálně přihlášené uživatele.

Můžete spustit více příkazů, kolik chcete, ale s omezením. Pomocí tohoto příkazu můžete určit své maximální argumenty.

 getconf ARG_MAX

No, co takhle vložit příkazy do souboru, a když potřebujeme spustit tyto příkazy, spustíme pouze tento soubor. Tomu se říká Bash skript.

Nejprve vytvořte nový soubor pomocí dotykového příkazu. Na začátku každého Bash skriptu bychom měli definovat, který shell budeme používat, protože v Linuxu je mnoho shellů, Bash shell je jedním z nich.

Shell skript shebang

První řádek, který zadáte při psaní Bash skriptu, je (#!), za nímž následuje shell, který použijete.

#! <===tento znak se nazývá shebang.

#!/bin/bash

Pokud použijete znak libry (#) před libovolným řádkem ve skriptu shellu, tento řádek se stane komentářem, což znamená, že nebude zpracován, ale výše uvedený řádek je speciální případ . Tento řádek definuje, jaký shell budeme používat, což je v našem případě Bash shell.

Příkazy shellu se zadávají jeden na řádek takto:

#!/bin/bash

# This is a comment

pwd

whoami

Na jeden řádek můžete napsat více příkazů, ale musíte je oddělit středníky, ale je lepší psát příkazy na samostatné řádky; to usnadní pozdější čtení.

Nastavit oprávnění skriptu

Po napsání skriptu shellu soubor uložte.

Nyní nastavte tento soubor jako spustitelný; jinak vám povolení odepře. Můžete si přečíst, jak nastavit oprávnění pomocí příkazu chmod.

chmod +x ./myscript

Pak to zkuste spustit pouhým zadáním do shellu:

./myscript

A ano, je proveden.

Vytvořte svůj první skript Bash

Jak víme z jiných příspěvků, tisk textu se neprovádí pomocí

echo

příkaz.

Upravte svůj soubor a zadejte toto:

#!/bin/bash

# our comment is here

echo "The current directory is:"

pwd

echo "The user logged in is:"

whoami

Podívejte se na výstup:

Perfektní! Nyní můžeme spouštět příkazy a zobrazovat text:

echo

Pokud neznáte příkaz echo nebo jak upravit soubor, doporučuji vám přečíst si předchozí články o základních příkazech Linuxu.

Použití proměnných

Proměnné vám umožňují ukládat informace, abyste je mohli použít ve vašem skriptu.

Ve skriptu shellu můžete definovat dva typy proměnných:

  • Proměnné prostředí
  • Uživatelské proměnné

Proměnné prostředí

Někdy je potřeba interagovat se systémovými proměnnými; můžete to udělat pomocí proměnných prostředí.

#!/bin/bash

# display user home

echo "Home for the current user is: $HOME"

Všimněte si, že jsme systémovou proměnnou $HOME vložili mezi dvojité uvozovky a ta vypíše proměnnou home správně.

Co když chceme vytisknout samotný znak dolaru?

echo "I have $1 in my pocket"

Protože proměnná 1 $ neexistuje, nebude fungovat. Jak to tedy překonat?

Můžete použít znak escape, což je zpětné lomítko \ před znakem dolaru takto:

echo "I have \$1 in my pocket"

Teď to funguje!!

Uživatelské proměnné

Ve skriptu také můžete nastavit a používat vlastní proměnné.

Uživatelské proměnné můžete volat stejným způsobem, jako je tento:

#!/bin/bash

# User variables

grade=5

person="Adam"

echo "$person is a good boy, he is in grade $grade"

chmod +x myscript

./myscript

Náhrada příkazů

Informace z výsledku příkazu můžete extrahovat pomocí substituce příkazů.

Náhradu příkazů můžete provést jednou z následujících metod:

  • Znak zpětného zaškrtnutí (`).
  • Formát $().

Ujistěte se, že když zadáváte znak zpětného zaškrtnutí, není to jednoduchá uvozovka.

Příkaz musíte uzavřít dvěma zpětnými zaškrtnutími takto:

mydir=`pwd`

Nebo jinak:

mydir=$(pwd)

Skript by tedy mohl vypadat takto:

#!/bin/bash

mydir=$(pwd)

echo $mydir

Výstup příkazu můžete uložit do proměnné mydir.

Matematický výpočet

Základní matematické výpočty můžete provádět pomocí $(( 2 + 2 )) formátu:

#!/bin/bash

var1=$(( 5 + 5 ))

echo $var1

var2=$(( $var1 * 2 ))

echo $var2

Tak snadné.

příkaz if-then

Vaše skripty shellu budou potřebovat podmíněné příkazy. Pokud je hodnota menší než 10, udělejte to jinak. Můžete si představit jakoukoli logiku, kterou chcete.

Nejzákladnější struktura příkazu if-then je tato:

příkaz if; pak

udělat něco

fi

a zde je příklad:

#!/bin/bash

if whoami; then

	echo "It works"

fi

Od

whoami

vrátí mého uživatele, takže podmínka se vrátí jako true a vytiskne zprávu.

Pojďme se ponořit hlouběji a použít další příkazy, které známe.

Zkontrolujte, zda uživatel existuje

Možná hledání konkrétního uživatele v souboru uživatele

/etc/passwd

a pokud záznam existuje, řekněte mi to ve zprávě.

#!/bin/bash

user=likegeeks

if grep $user /etc/passwd; then

	echo "No such a user $user"

fi

Používáme

/etc/passwd

soubor. Můžete se podívat na náš tutoriál o příkazu grep.

Pokud uživatel existuje, skript shellu zprávu vytiskne.

Co když uživatel neexistuje? Skript ukončí provádění, aniž by nám řekl, že uživatel neexistuje. Dobře, pojďme skript ještě vylepšit.

příkaz if-then-else

Příkaz if-then-else má následující strukturu:

příkaz if; pak

udělat něco

jinak

udělat jinou věc

fi

Pokud se první příkaz spustí a vrátí nulu, což znamená úspěch, nezasáhne příkazy po příkazu else; jinak, pokud příkaz if vrátí nenulovou hodnotu; což znamená, že podmínka příkazu selže, v tomto případě shell zasáhne příkazy po příkazu else.

#!/bin/bash

user=anotherUser

if grep $user /etc/passwd; then

	echo "The user $user Exists"

else

	echo "The user $user doesn’t exist"

fi

Zatím se nám daří, pokračujte v pohybu.

A teď, co když potřebujeme další prohlášení.

No, to je snadné, toho můžeme dosáhnout vnořením příkazů if typu:

if podmínka1; pak

příkazy

elif podmínka2; pak

příkazy

fi

Pokud první příkaz vrátí nulu; znamená úspěch, provede příkazy za ním, jinak pokud druhý příkaz vrátí nulu, spustí příkazy za ním, jinak pokud žádný z nich nevrátí nulu, provede pouze poslední příkazy.

#!/bin/bash

user=anotherUser

if grep $user /etc/passwd; then

	echo "The user $user Exists"

elif ls /home; then

	echo "The user doesn’t exist"

fi

Můžete si představit jakýkoli scénář, možná pokud uživatel neexistuje, vytvořte uživatele pomocí

useradd

příkaz nebo něco jiného.

Kombinovat testy

Pomocí příkazu AND (&&) nebo OR (||) můžete kombinovat více testů.

#!/bin/bash

dir=/home/likegeeks

name="likegeeks"

if [ -d $dir ] && [ -n $name ]; then

	echo "The name exists and the folder $dir exists."

else

	echo "One test failed"

fi

Tento příklad vrátí hodnotu true pouze v případě, že oba testy uspěly; jinak selže.

Také můžete použít OR (||) stejným způsobem:

#!/bin/bash

dir=/home/likegeeks

name="likegeeks"

if [ -d $dir ] || [ -n $name ]; then

	echo "Success!"

else

	echo "Both tests failed"

fi

Tento příklad by vrátil úspěch, pokud by jeden nebo oba uspěli.

Selhal by pouze v případě, že by selhaly oba.

Číselná srovnání

Číselné srovnání mezi dvěma číselnými hodnotami můžete provést pomocí kontrol číselného porovnání takto:

číslo1 -eq číslo2 Zkontroluje, zda se číslo1 rovná číslu2.

číslo1 -ge číslo2 Zkontroluje, zda je číslo1 větší nebo rovno číslu2.

číslo1 -gt číslo2 Zkontroluje, zda je číslo1 větší než číslo2.

číslo1 -le číslo2 Zkontroluje, zda je číslo1 menší nebo rovno číslu2.

číslo1 -lt číslo2 Zkontroluje, zda je číslo1 menší než číslo2.

číslo1 -ne číslo2 Zkontroluje, zda číslo1 není rovno číslu2.

Jako příklad vyzkoušíme jeden z nich a zbytek je stejný.

Všimněte si, že porovnávací příkaz je v hranatých závorkách, jak je znázorněno.

#!/bin/bash

num=11

if [ $num -gt 10]; then

	echo "$num is bigger than 10"

else

	echo "$num is less than 10"

fi

Číslo je větší než deset, takže spustí první příkaz a vytiskne první echo.

Porovnání řetězců

Řetězce můžete porovnat jedním z následujících způsobů:

string1 =string2 Zkontroluje, zda string1 identický s string2.

string1 !=string2 Zkontroluje, zda string1 není identický s string2.

řetězec1 <řetězec2 Zkontroluje, zda je řetězec1 menší než řetězec2.

řetězec1> řetězec2 Zkontroluje, zda je řetězec1 větší než řetězec2.

-n řetězec1 Zkontroluje, zda je řetězec1 delší než nula.

-z řetězec1 Zkontroluje, zda má řetězec1 nulovou délku.

Na náš příklad můžeme použít porovnání řetězců:

#!/bin/bash

user="likegeeks"

if [ $user = $USER ]; then

	echo "The user $user&nbsp; is the current logged in user"

fi

Jedna záludná poznámka o větším než a menším než pro porovnání řetězců MUSÍ být uniknut pomocí zpětného lomítka protože pokud použijete pouze symbol větší než, zobrazí se nesprávné výsledky.

Takže byste to měli udělat takto:

#!/bin/bash

v1=text

v2="another text"

if [ $v1 \> "$v2" ]; then

	echo "$v1 is greater than $v2"

else

	echo "$v1 is less than $v2"

fi

Spustí se, ale zobrazí toto varování:

./myscript: line 5: [: too many arguments

Chcete-li to opravit, zabalte $vals do dvojitých uvozovek a přinutíte je zůstat jako jeden řetězec takto:

#!/bin/bash

v1=text

v2="another text"

if [ $v1 \> "$v2" ]; then

	echo "$v1 is greater than $v2"

else

	echo "$v1 is less than $v2"

fi

Kritická poznámka o větším než a menším než pro srovnání řetězců. Podívejte se na následující příklad, abyste pochopili rozdíl:

#!/bin/bash

v1=Likegeeks

v2=likegeeks

if [ $v1 \> $v2 ]; then

	echo "$v1 is greater than $v2"

else

	echo "$v1 is less than $v2"

fi

sort myfile

likegeeks

Likegeeks

Testovací podmínka bere v úvahu malá písmena větší než velká písmena.

sort

Na rozdíl od příkazu sort, který dělá opak.

Testovací podmínka je založena na pořadí ASCII.

sort

Zatímco příkaz řazení je založen na pořadí číslování ze systémových nastavení.

Porovnání souborů

Soubory můžete porovnávat a kontrolovat pomocí následujících operátorů:

-d můj_soubor Zkontroluje, zda se jedná o složku.

-e můj_soubor Zkontroluje, zda je soubor dostupný.

-f můj_soubor Zkontroluje, zda se jedná o soubor.

-r my_file Zkontroluje, zda je čitelný.

můj_soubor nt my_file2 Zkontroluje, zda je můj_soubor novější než můj_soubor2.

můj_soubor ot my_file2 Zkontroluje, zda je můj_soubor starší než můj_soubor2.

-O můj_soubor Zkontroluje, zda se vlastník souboru a přihlášený uživatel shodují.

-G můj_soubor Zkontroluje, zda soubor a přihlášený uživatel mají identickou skupinu.

Jak naznačují, nikdy na ně nezapomenete.

Vyberme jednu z nich a vezměme si ji jako příklad:

#!/bin/bash

mydir=/home/likegeeks

if [ -d $mydir ]; then

	echo "Directory $mydir exists"

	cd $mydir

	ls

else

	echo "NO such file or directory $mydir"

fi

Nebudeme uvádět každý z nich jako příklad. Jednoduše zadáte srovnání mezi hranatými závorkami tak, jak je, a dokončíte skript normálně.

Existuje několik dalších pokročilých funkcí typu if-then, ale pojďme si to představit v jiném příspěvku.

To je prozatím. Doufám, že se vám to bude líbit a budete trénovat víc a víc.

Děkuji.


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

  2. Jak porovnávat řetězce ve skriptování Bash Shell

  3. Najít a nahradit ve skriptování shellu

  1. Zobrazování obsahu nejvyšší hodnoty ve skriptování Shell?

  2. Jak analyzovat Json pomocí skriptování Shell v Linuxu?

  3. Příkaz blokuje mechanismus ve skriptování Shell?

  1. Mám používat skriptování Apt nebo Apt-get In Shell?

  2. Symbol backtick (`) v Linux Shell Scripting

  3. Co je use() ve skriptování shellu?