9 exemple de script Bash pentru a începe să utilizați Linux

Publicat: 2022-07-05
Terminal Linux pe ecranul unui laptop.
fatmawati achmad zaenuri/Shutterstock.com

Dacă începeți cu scripting-ul Bash pe Linux, obținerea unei înțelegeri solide a elementelor de bază vă va ajuta. Ele sunt baza unei cunoștințe mai profunde și a unor abilități mai înalte de scripting.

Amintiți-vă, faceți scripturile dvs. executabile

Pentru ca shell-ul să execute un script, scriptul trebuie să aibă setat permisiunea pentru fișierul executabil. Fără aceasta, scriptul tău este doar un fișier text. Cu el, este încă un fișier text, dar shell-ul știe că conține instrucțiuni și va încerca să le execute când scriptul este lansat.

Scopul scrierii de scripturi este că acestea rulează, așa că primul pas de bază este să știi cum să anunți Linux că scriptul tău ar trebui considerat executabil.

Comanda chmod ne permite să setăm permisiunile pentru fișiere. Permisiunea de execuție poate fi setată cu indicatorul +x.

 chmod +x script1.sh 

Realizarea unui script executabil

Va trebui să faceți acest lucru pentru fiecare dintre scripturile dvs. Înlocuiți „script1.sh” cu numele scriptului dvs.

1. Care este acea prima linie ciudată?

Prima linie a unui script spune shell-ului care interpret trebuie apelat pentru a rula acel script. Prima linie trebuie să înceapă cu un shebang, „#!”, cunoscut și ca hashbang. „#!” spune shell-ului că această linie conține calea și numele interpretului pentru care a fost scris scriptul.

Acest lucru este important deoarece, dacă ați scris un script pentru a rula în Bash, nu doriți să fie interpretat de un alt shell. Este posibil să existe incompatibilități. Bash – ca majoritatea shell-urilor – are propriile sale particularități de sintaxă și funcționalitate pe care alte shell-uri nu le vor avea sau le vor fi implementate diferit.

Când rulați un script, shell-ul curent deschide script-ul și determină ce shell sau interpret trebuie utilizat pentru a executa acel script. Apoi lansează acel shell și îi transmite scriptul.

 #!/bin/bash

echo Rulează în $SHELL

Prima linie a acestui script poate fi citită ca „Utilizați interpretul situat la /bin/bash pentru a rula acest script”.

Singura linie din script scrie valoarea deținută în variabila de mediu $SHELL pe ecranul terminalului. Acest lucru confirmă faptul că Bash a fost folosit pentru a executa scriptul.

 ./script1.sh 

Identificarea shell-ului pe care rulează un script

Ca un mic truc de salon, putem demonstra că scenariul este transmis oricărui interpret pe care îl selectăm.

 #!/bin/cat
Toate liniile de text sunt trecute la comanda cat
și sunt tipărite în fereastra terminalului. Care include
linia shebang.
 script2.sh 

Rularea unui script prin trecerea lui la comanda cat

Acest script este lansat de shell-ul curent și transmis comenzii cat . Comanda cat „rulează” scriptul.

Dacă scrieți în acest fel slujbele, presupuneți că știți unde se află shell-ul sau alt interpret pe mașina țintă. Și în 99% din timp, asta e în regulă. Dar unora le place să-și acopere pariurile și să-și scrie anunțurile astfel:

 #!/usr/bin/env bash

echo Rulează în $SHELL
 script3.sh 

Rularea unui script care caută shell

Când scriptul este lansat, shell-ul caută locația shell-ului numit. Dacă se întâmplă ca shell-ul să fie într-o locație non-standard, acest tip de abordare poate evita erorile de „interpret rău”.

Nu asculta, minte!

În Linux, există întotdeauna mai multe moduri de a jupui o pisică sau de a dovedi că un autor se înșeală. Pentru a fi complet real, există o modalitate de a rula scripturi fără un shebang și fără a le face executabile.

Dacă lansați shell-ul pentru care doriți să executați scriptul și treceți scriptul ca parametru de linie de comandă, shell-ul va lansa și rula scriptul - indiferent dacă este executabil sau nu. Deoarece alegeți shell-ul pe linia de comandă, nu este nevoie de un shebang.

Acesta este întregul scenariu:

 echo „Am fost executat de” $SHELL

Vom folosi ls pentru a vedea că scriptul cu adevărat nu este executabil și vom lansa Bash cu numele scriptului:

 ls
 bash script4.sh 

Rularea unui script care nu are setată permisiunea pentru fișierul executabil și nu are un shebang

Există, de asemenea, o modalitate de a avea un script rulat de shell-ul curent , nu un shell lansat special pentru a executa script-ul. Dacă utilizați comanda source , care poate fi prescurtată la o singură punct „ . „, scriptul tău este executat de shell-ul tău actual.

Deci, pentru a rula un script fără un shebang, fără permisiunea fișierului executabil și fără a lansa un alt shell, puteți utiliza oricare dintre aceste comenzi:

 sursă script4.sh
 . script4.sh 

Rularea unui script în shell-ul curent

Deși acest lucru este posibil, nu este recomandat ca soluție generală. Există dezavantaje.

Dacă un script nu conține un shebang, nu puteți spune pentru ce shell a fost scris. Îți vei aminti peste un an? Și fără ca permisiunea executabil să fie setată pe script, comanda ls nu o va identifica ca fișier executabil și nici nu va folosi culoarea pentru a distinge scriptul de fișierele text simplu.

LEGATE: Liniile de comandă: de ce oamenii încă se deranjează cu ele?

2. Tipărirea textului

Scrierea textului pe terminal este o cerință comună. Un pic de feedback vizual merge mult.

Pentru mesaje simple, comanda echo va fi suficientă. Permite o anumită formatare a textului și vă permite să lucrați și cu variabile.

 #!/bin/bash

echo Acesta este un șir simplu.
echo „Acesta este un șir care conține „ghilimele simple”, așa că este înfășurat între ghilimele duble.”
echo „Aceasta afișează numele de utilizator:” $USER
echo -e „Opțiunea -e ne permite să folosim\ndirective de formatare\pentru a împărți șirul.”
 ./script5.sh 

Un script care utilizează comanda echo pentru a scrie în fereastra terminalului

Comanda printf ne oferă mai multă flexibilitate și capacități de formatare mai bune, inclusiv conversia numerelor.

Acest script tipărește același număr folosind trei baze numerice diferite. Versiunea hexazecimală este, de asemenea, formatată pentru a fi tipărită cu majuscule, cu zerouri de început și o lățime de trei cifre.

 #!/bin/bash

printf „Decimal: %d, Octal: %o, Hexazecimal: %03X\n” 32 32 32
 ./script6.sh 

Un script care utilizează printf pentru a converti și a formata numere

Rețineți că, spre deosebire de echo , trebuie să spuneți printf să înceapă o nouă linie cu simbolul „ \n ”.

3. Crearea și utilizarea variabilelor

Variabilele vă permit să stocați valori în programul dvs. și să le manipulați și să le utilizați. Puteți să vă creați propriile variabile sau să utilizați variabile de mediu pentru valorile de sistem.

 #!/bin/bash

millennium_text="Ani de la mileniu:"

current_time=$( data '+%H:%M:%S')
ziua_azi=$( data '+%F' )
an=$(data '+%Y')

echo „Ora curentă:” $current_time
echo „Data de azi:” $todays_date

ani_din_Y2K=$(( an - 2000 ))

echo $milennium_text $ani_din_Y2K

Acest script creează o variabilă șir numită millennium_text . Conține o linie de text.

Apoi creează trei variabile numerice.

  • Variabila current_time este inițializată la momentul executării scriptului.
  • Variabila todays_date este setată la data la care este rulat scriptul.
  • Variabila year deține anul curent.

Pentru a accesa valoarea stocată într-o variabilă, precedați numele acesteia cu semnul dolar „$”.

 ./script7.sh 

Un script care utilizează variabile pentru a calcula perioadele de timp

Scriptul tipărește ora și data, apoi calculează câți ani au trecut de la mileniu și stochează acest lucru în variabila years_since_Y2K .

În cele din urmă, tipărește șirul conținut în variabila millennium_text și valoarea numerică stocată în years_since_Y2K .

LEGATE: Cum să lucrați cu variabile în Bash

4. Gestionarea intrărilor utilizatorului

Pentru a permite unui utilizator să introducă o valoare pe care scriptul o va folosi, trebuie să puteți captura introducerea de la tastatură a utilizatorului. Comanda de read Bash vă permite să faceți exact asta. Iată un exemplu simplu.

 #!/bin/bash

echo "Introduceți un număr și apăsați pe \"Enter\""
citește user_number1;
echo "Introduceți un alt număr și apăsați pe \"Enter\""
citește user_number2;

printf „Ați introdus: %d și %d\n” $user_number1 $user_number2
printf „Adunate împreună, fac: %d\n” $(( user_number1 + user_number2))

Scriptul solicită două numere. Acestea sunt citite de la tastatură și stocate în două variabile, user_number1 și user_number2 .

Scriptul tipărește numerele în fereastra terminalului, le adună și tipărește totalul.

 ./script8.sh 

Captarea intrărilor utilizatorului cu comanda citire

Putem combina solicitările în comenzile de read folosind opțiunea -p (prompt).

 #!/bin/bash

citește -p "Introduceți un număr și apăsați pe \"Enter\" " user_number1;
citește -p „Introduceți alt număr și apăsați pe \"Enter\" " user_number2;

printf „Ați introdus: %d și %d\n” $user_number1 $user_number2
printf „Adunate împreună, fac: %d\n” $(( user_number1 + user_number2))

Acest lucru face lucrurile mai ordonate și mai ușor de citit. Scripturile care sunt ușor de citit sunt, de asemenea, mai ușor de depanat.

 ./script9.sh 

Capturarea intrărilor utilizatorului cu comanda citire și opțiunea -p (prompt).

Scenariul se comportă ușor diferit acum. Intrarea utilizatorului este pe aceeași linie cu promptul.

Pentru a captura intrarea de la tastatură fără ca aceasta să fie transmisă în fereastra terminalului, utilizați opțiunea -s (silențios).

 #!/bin/bash

citește -s -p „Introduceți PIN-ul dvs. secret și apăsați pe \"Enter\" " secret_PIN;

printf "\nShhh ... este %d\n" $secret_PIN
 ./script10.sh 

Capturarea intrărilor utilizatorului fără a le scrie în fereastra terminalului

Valoarea de intrare este capturată și stocată într-o variabilă numită secret_PIN , dar nu este transmisă pe ecran când utilizatorul o tastează . Ce faci cu el după aceea depinde de tine.

5. Acceptarea parametrilor

Uneori este mai convenabil să accepti intrarea utilizatorului ca parametri ai liniei de comandă decât să ai un script care așteaptă intrarea. Transmiterea de valori unui script este ușoară. Ele pot fi referite în interiorul scriptului ca și cum ar fi orice altă variabilă.

Primul parametru devine variabil $1 , al doilea parametru devine variabil $2 și așa mai departe. Variabila $0 deține întotdeauna numele scriptului, iar variabila $# deține numărul de parametri care au fost furnizați pe linia de comandă. Variabila $@ este un șir care conține toți parametrii liniei de comandă.

 #!/bin/bash

printf „Acest script se numește: %s\n” $0
printf „Ați folosit %d parametri de linie de comandă\n” $#

# buclă prin variabile
pentru param în „$@”; do
  echo „$param”
Terminat

echo „Parametrul 2 a fost:” $2

Acest script folosește $0 și $# pentru a tipări unele informații. apoi folosește ?@ pentru a parcurge toți parametrii liniei de comandă. Folosește $2 pentru a arăta cum să accesezi o singură valoare a parametrului.

 ./script11.sh 

Utilizarea parametrilor liniei de comandă cu un script

Încheierea mai multor cuvinte între ghilimele „”” le combină într-un singur parametru.

6. Citirea datelor din fișiere

A ști cum să citești date dintr-un fișier este o abilitate grozavă de avut. Putem face acest lucru în Bash cu o buclă while.

 #!/bin/bash

LineCount=0

în timp ce IFS='' citește -r LinefromFile || [[ -n „${LinefromFile}” ]]; do

  ((LineCount++))
  echo „Se citește linia $LineCount: ${LinefromFile}”

gata < "$1"

Trecem numele fișierului pe care vrem să îl proceseze scriptul ca parametru de linie de comandă. Va fi singurul parametru, așa că în interiorul scriptului $1 va păstra numele fișierului. Redirecționăm acel fișier în bucla while .

Cum să procesați un fișier linie cu linie într-un script Linux Bash
LEGATE Cum să procesați un fișier linie cu linie într-un script Linux Bash

Bucla while setează separatorul de câmp intern la un șir gol, folosind atribuirea IFS='' . Acest lucru împiedică comanda de read să împartă linii în spații albe. Numai întoarcerea căruciorului de la capătul unei linii este considerată a fi adevăratul capăt al liniei.

Clauza [[ -n "${LinefromFile}" ]] ține cont de posibilitatea ca ultima linie din fișier să nu se termine cu o întoarcere de transport. Chiar dacă nu, acea ultimă linie va fi tratată corect și tratată ca o linie obișnuită compatibilă cu POSIX.

 ./script12.sh twinkle.txt 

Citirea textului dintr-un fișier cu un script

7. Utilizarea Testelor Condiționale

Dacă doriți ca scriptul să efectueze diferite acțiuni pentru diferite condiții, trebuie să efectuați teste condiționate. Sintaxa testului cu paranteze duble oferă – la început – un număr copleșitor de opțiuni.

 #!/bin/bash

preț=1 USD

if [[ price -ge 15 ]];
apoi
  ecou „Prea scump”.
altfel
  echo "Cumpără-l!"
fi

Bash oferă un întreg set de operatori de comparație care vă permit să determinați lucruri precum dacă un fișier există, dacă puteți citi din el, dacă puteți scrie în el și dacă există un director.

De asemenea, are teste numerice pentru egal cu -qe , mai mare decât -gt , mai mic sau egal cu -le și așa mai departe, deși puteți utiliza și notația familiară == , >= , <= .

 ./script13.sh 13
 ./script13.sh 14
 ./script13.sh 15
 ./script13.sh 16 

Rularea unui script cu un test condiționat

8. Puterea buclelor for

Repetarea acțiunilor din nou și din nou se realizează cel mai bine folosind bucle. O buclă for vă permite să rulați o buclă de mai multe ori. Acesta poate fi până la un anumit număr sau poate fi până când bucla și-a parcurs o listă de articole.

 #!/bin/bash

pentru (( i=0; i<=$1; i++ ))
do
  echo "C-style for bucla:" $i
Terminat

pentru i în {1..4}
do
  echo "For buclă cu un interval:" $i
Terminat

pentru eu in "zero" "unu" "doua" "trei"
do
  echo „For buclă cu o listă de cuvinte:” $i
Terminat

website="How To Geek"

pentru mine în $site-ul web
do
  echo „For buclă cu o colecție de cuvinte:” $i
Terminat

Toate aceste bucle sunt bucle for , dar lucrează cu diferite tipuri de instrucțiuni și date de buclă.

 ./script14.sh 3 

Rularea unui script cu patru tipuri diferite de buclă for

Prima buclă este o buclă clasică for stil C. Contorul de bucle i este inițializat la zero și este incrementat cu fiecare ciclu al buclei. În timp ce valoarea lui i este mai mică sau egală cu valoarea deținută în $1 , bucla va continua să ruleze.

A doua buclă funcționează prin intervalul de numere de la 1 la 4. A treia buclă funcționează printr-o listă de cuvinte. Deși există mai multe cuvinte de procesat, bucla continuă să se repete.

Ultima buclă funcționează prin lista de cuvinte dintr-o variabilă șir.

9. Funcții

Funcțiile vă permit să încapsulați secțiuni de cod în rutine numite care pot fi apelate de oriunde în cadrul scriptului.

Să presupunem că dorim ca scriptul nostru care citește linii dintr-un fișier să facă un fel de procesare pe fiecare linie. Ar fi convenabil ca acel cod să fie conținut într-o funcție.

 #!/bin/bash

LineCount=0

funcția count_words() {
  printf „%d cuvinte în linia %d\n” $(echo $1 | wc -w) $2
}

în timp ce IFS='' citește -r LinefromFile || [[ -n „${LinefromFile}” ]]; do

  ((LineCount++))
  count_words „$LinefromFile” $LineCount

gata < "$1"

count_words „Acesta nu este în buclă” 99

Am modificat programul nostru de citire a fișierelor adăugând o funcție numită count_words . Este definit înainte de a fi nevoie să-l folosim.

Definiția funcției începe cu cuvântul function . Acesta este urmat de un nume unic pentru funcția noastră, urmat de paranteze „ () ”. Corpul funcției este cuprins între paranteze „{}”.

Definiția funcției nu determină executarea niciunui cod. Nimic din funcție nu este rulat până când funcția este apelată.

Funcția count_words afișează numărul de cuvinte dintr-o linie de text și numărul rândului. Acești doi parametri sunt trecuți în funcție la fel cum parametrii sunt trecuți într-un script. Primul parametru devine variabila funcție $1 , iar al doilea parametru devine variabila funcție $2 și așa mai departe.

Bucla while citește fiecare linie din fișier și o transmite funcției count_words , împreună cu numărul liniei. Și doar pentru a arăta că putem apela funcția din diferite locuri din script, o numim din nou în afara buclei while .

 ./script15.sh twinkle.txt 

Rularea unui script care folosește o funcție

Nu vă temeți de curba de învățare

Scenariul este plin de satisfacții și util, dar greu de introdus. Odată ce obțineți câteva tehnici reutilizabile, veți putea scrie relativ ușor scripturi utile. Apoi, puteți căuta o funcționalitate mai avansată.

Mergeți înainte de a putea alerga și fă-ți timp să te bucuri de călătorie.

LEGATE: 10 comenzi de bază Linux pentru începători