9 exemple de script Bash pentru a începe să utilizați Linux
Publicat: 2022-07-05
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
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
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
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
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
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
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
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
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
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
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
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
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
Î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
.
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
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
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
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
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