Sot do tĂ« flasim pĂ«r bash-skripte. Kjo Ă«shtĂ« â , qĂ« janĂ« shkruar pĂ«r shell-in bash. Ka edhe shell tĂ« tjera, pĂ«r shembull â zsh, tcsh, ksh, por ne do tĂ« pĂ«rqendrohemi nĂ« bash. Ky material Ă«shtĂ« pĂ«r tĂ« gjithĂ« ata qĂ« duan, kushti i vetĂ«m Ă«shtĂ« qĂ« tĂ« dinĂ« tĂ« punojnĂ« me Linux.
Skenarët e komandave të linjës së komandës janë grupe të njëjtave komandë që mund të shkruhen me tastierë, të mbledhura në skedarë dhe të bashkuara për një qëllim të caktuar. Në të njëjtën kohë, rezultatet e punës së komandave mund të paraqesin vlerë të pavarur ose të shërbejnë si të dhëna hyrëse për komandat e tjera. Skenarët janë një mënyrë e fuqishme për të automatizuar veprime që kryhen shpesh.
Pra, nëse flasim për linjën e komandës, ajo lejon ekzekutimin e disa komandave në një herë, duke i futur ato përmes pikësës:
pwd ; whoami Në të vërtetë, nëse e provuat këtë në terminalin tuaj, skripti juaj i parë bash, në të cilin janë përfshirë dy komanda, është tashmë shkruar. Ai funksionon kështu. Së pari, komanda pwd shfaq informacionin mbi direktorinë aktuale të punës dhe më pas komanda whoamitregon të dhënat mbi përdoruesin nën të cilin jeni regjistruar në sistem.
Duke përdorur një qasje të tillë, mund të kombinoni sa më shumë komanda në një linjë, kufizimi është vetëm numri maksimal i argumenteve që mund t'i jepen programit. Ky kufizim mund të përcaktohet duke përdorur komandën e tillë:
getconf ARG_MAXKomanda e rreshtit Ă«shtĂ« njĂ« mjet i shkĂ«lqyer, por komandat duhet t'i futni çdo herĂ« kur keni nevojĂ« pĂ«r to. ĂfarĂ« nĂ«se regjistroni njĂ« grup komandash nĂ« njĂ« skedar dhe thjesht e thĂ«rrisni kĂ«tĂ« skedar pĂ«r t'i ekzekutuar? NĂ« thelb, ai skedar mbi tĂ« cilin flasim quhet skenar i komandĂ«s.
Si janë organizuar skenaret bash
Krijoni një skedar të zbrazët duke përdorur komandën touch. Në rreshtin e tij të parë, duhet të tregoni se cilën shell do të përdorni. Nashta kemi interes për bash, kështu që rreshti i parë i skedarit do të jetë kështu:
#!/bin/bash Në rreshtat e tjerë të këtij skedari, simboli i gdhendjes përdoret për të shënuar komentet, të cilat shell-i nuk i përpunon. Megjithatë, rreshti i parë është një rast i veçantë, këtu gdhendja, pas së cilës ndjek një shenjë nënvizimi (kjo sekuencë quhet ) dhe rruga për bash, i thonë sistemit se skenari është krijuar pikërisht për bash.
Komandat e shell-it ndahen nga shenja e kalimit të rreshtit, komentet shquhen me shenjën e gdhendjes. Ja si duket kjo:
#!/bin/bash
# This is a comment
pwd
whoamiKëtu, ashtu si në komandën e linjës, mund të shkruani komanda në një rresht, duke i ndarë me pikëpresje. Megjithatë, nëse shkruani komandat në rreshta të ndryshëm, skedari është më i lehtë për t'u lexuar. Në çdo rast, shell do t'i përpunojë ato.
Vendosja e lejeve për skedarin skenar
Ruani skedarin duke i dhënë një emër myscript, dhe puna për krijimin e skriptit bash është pothuajse e përfunduar. Tani ka mbetur vetëm ta bëni këtë skedar ekzekutues, përndryshe, duke u përpjekur ta ekzekutoni atë, do të përballeni me një gabim Leje e refuzuar.

Përpjekja për të ekzekutuar skedarin me leje të papërshtatshme
Le ta bëjmë skedarin ekzekutues:
chmod +x ./myscriptTani le të përpiqemi ta ekzekutojmë atë:
./myscriptPas konfigurimit të lejeve, gjithçka punon siç duhet.

Ekzekutimi i suksesshëm i skenarit bash
Shfaqja e mesazheve
Për të shfaqur tekstin në konsolën Linux, përdoret komanda echo. Të shfrytëzojmë njohurinë e këtij fakti dhe të redaktojmë skriptin tonë duke shtuar shpjegime për të dhënat që shfaqin komandat ekzistuese në të:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiJa çfarë do të dalë pas ekzekutimit të skriptit të përditësuar.

Shfaqja e mesazheve nga skripti
Tani mund të shfaqim tituj shpjegues duke përdorur komandën echo. Nëse nuk e dini si ta editoje një skedër duke përdorur mjetet Linux, ose nuk ke hasur më parë me komandën echo, shikoni në materialin.
Përdorimi i variablave
Variablat lejojnĂ« ruajtjen e informacionit nĂ« skedĂ«n e skriptit, pĂ«r shembull â rezultatet e komandeve pĂ«r t'u pĂ«rdorur nga komanda tĂ« tjera.
Nuk ka asgjë të keqe në ekzekutimin e komandave të veçanta pa ruajtjen e rezultateve të punës së tyre, por mundësitë e këtij qasjeje janë shumë të kufizuara.
Ekzistojnë dy lloje variablash që mund të përdoren në skriptet bash:
- Variablat e mjedisit
- Variablat e përdoruesit
Variablat e mjedisit
Ndonjëherë, në komandat e shell duhet të punoni me disa të dhëna sistemike. Ja se si mund të printoni direktorinë e shtëpisë së përdoruesit aktual:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Vini re se ne mund të përdorim variablën sistemike $HOME në thonjëza të dyfishta, kjo nuk do ta pengojë sistemin ta njohë atë. Ja çfarë do të ndodhë nëse ekzekutojmë skriptin e mësipërm.

Përdorimi i variablës së mjedisit në skript
E çfarë nëse duam të printojmë simbolin e dollarit? Të provokojmë kështu:
echo "Kam $1 nĂ« xhepin tim" Sistemi do tĂ« zbulojĂ« shenjĂ«n e dollarit nĂ« vargun e kufizuar me thonjza dhe do tĂ« vendosĂ« se po i referohemi njĂ« variabli. Skripti do tĂ« pĂ«rpiqet tĂ« shfaqĂ« vlerĂ«n e njĂ« variabli tĂ« papĂ«rcaktuar. $1. Kjo nuk Ă«shtĂ« ajo qĂ« na nevojitet. ĂfarĂ« tĂ« bĂ«jmĂ«?
Në një situatë të tillë do të ndihmojë përdorimi i karakterit kontrollues, një kënd i prapë, përpara shenjës së dollarit:
echo "Kam $1 në xhepin tim"Tani skripti do të shfaqë pikërisht atë që pritet.

Përdorimi i sekuencës kontrolluese për të shfaqur shenjën e dollarit.
Variablat e përdoruesit
Përveç variablave të mjedisit, skriptet bash lejojnë të caktosh dhe përdorësh variablat e tu brenda skriptit. Këto variabla mbajnë vlerën deri sa të përfundojë ekzekutimi i skriptit.
Siç ndodh me variablat sistemike, mund të aksesosh variablat e përshtatshëm duke përdorur shenjën e dollarit:
TNW-CUS-FMP â kodi promocional pĂ«r njĂ« zbritje prej 10% pĂ«r shĂ«rbimet tona, i disponueshĂ«m pĂ«r aktivizim brenda 7 ditĂ«ve.
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Kjo është ajo që do të rezultojë pas ekzekutimit të këtij skripti.

Variablat e përshtatshëm në skript
Zëvendësimi i komandave
Një nga funksionalitetet më të dobishme të skripteve bash është mundësia për të nxjerrë informacion nga dalja e komandave dhe për ta caktuar atë në variabla, gjë që lejon përdorimin e këtij informacioni kudo në skedarin e skriptit.
Kjo mund të bëhet në dy mënyra.
- Me ndihmën e simboleve të apostrofëve të kthyer "`".
- Me ndihmën e strukturës.
$()
Duke përdorur qasjen e parë, sigurohuni që të mos fusni një thonjëz të vetme në vend të apostrofëve të kthyer. Komanda duhet të vendoset brenda dy simboleve të tillë:
mydir=`pwd`Me qasjen e dytë, e njëjta gjë shkruhet kështu:
mydir=$(pwd)Dhe skripti mund të duket kështu:
#!/bin/bash
mydir=$(pwd)
echo $mydir Gjatë përmbushjes së tij, dalja e komandës pwddo të ruhet në variablën mydir, përmbajtja e së cilës, duke përdorur komandën echo, do të shfaqet në konsolë.

Skripti që ruan rezultatet e punës së komandës në një variabël.
Operacione matematikore.
Për kryerjen e operacioneve matematikore në skedarin e skriptit, mund të përdorni strukturën e llojit $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Operacione matematikore në skenar.
Struktura kontrolluese if-then.
Në disa skenarë, është e nevojshme të menaxhohet fluksi i ekzekutimit të komandave. Për shembull, nëse një vlerë është më e madhe se pesë, duhet të kryhet një veprim, përndryshe një tjetër. Kjo është e aplikueshme në shumë situata, dhe këtu na ndihmon struktura kontrolluese. nëse-atëherë. Në formën e saj më të thjeshtë, ajo duket kështu:
nëse komanda
atëherë
komandat
fiJa një shembull i punës:
#!/bin/bash
if pwd
then
echo "It works"
fi Në këtë rast, nëse ekzekutimi i komandës pwdpërfundon me sukses, në konsol do të printohet teksti «it works».
Të shfrytëzojmë njohuritë që kemi dhe të shkruajmë një skenar më kompleks. Le të themi, duhet të gjejmë një përdorues në /etc/passwd, dhe nëse e gjejmë, të informojmë se ai ekziston.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiKëtu është ajo që del pas ekzekutimit të këtij skripti.

Kërkimi i përdoruesit
Këtu kemi përdorur komandën greppër të kërkuar përdoruesin në skedarin /etc/passwd. Nëse komanda grepnuk ju është e njohur, përshkrimi i saj mund të gjendet .
Në këtë shembull, nëse përdoruesi gjendet, skripti do të nxjerrë një mesazh përkatës. Por nëse nuk arrihet të gjendet përdoruesi? Në këtë rast, skripti do të mbyllet pa na thënë asgjë. Do të ishte mirë që të na informonte edhe për këtë, prandaj do ta përmirësojmë kodin.
Konstrukti mbikëqyrës if-then-else
Për të mundësuar që programa të njoftojë si për rezultatet e suksesit, ashtu edhe për dështimin, do të përdorim strukturën nëse-atëherë-ndryshe. Këtu është si është e ndërtuar:
if komanda
then
komanda
else
komanda
fi Nëse komanda e parë kthen zero, që do të thotë se është ekzekutuar me sukses, kushti do të jetë i vërtetë dhe ekzekutimi nuk do të shkojë sipas degës else. Në rast të kundërt, nëse kthehet ndonjë gjë ndryshe nga zero, që do të thotë dështim ose rezultat të rremë, do të ekzekutohen komandat që ndodhen pas else.
Do ta shkruajmë një skript të tillë:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesnât exist"
fi Ekzekutimi i tij shkoi sipas degës else.

Ekzekutimi i skriptit me strukturën if-then-else
MirĂ«, vazhdojmĂ« pĂ«rpara dhe le tĂ« pyesim pĂ«r kushte mĂ« tĂ« komplikuara. ĂfarĂ« nĂ«se duhet tĂ« kontrollojmĂ« jo njĂ«, por disa kushte? PĂ«r shembull, nĂ«se pĂ«rdoruesi i dĂ«shiruar Ă«shtĂ« gjetur, duhet tĂ« shfaqim njĂ« mesazh, nĂ«se pĂ«rmbushet ndonjĂ« kusht tjetĂ«r â njĂ« mesazh tjetĂ«r, etj. NĂ« njĂ« situatĂ« tĂ« tillĂ«, do na ndihmojnĂ« kushtet e ndĂ«rshuara. Kjo duket kĂ«shtu:
if komanda1
then
komandat
elif komanda2
then
komandat
fi Nëse komanda e parë kthen zero, që tregon për përfundimin e suksesshëm, do të ekzekutohen komandat në bllokun e parë. then, përndryshe, nëse kushti i parë dështojë, dhe nëse komanda e dytë kthen zero, do të ekzekutohet blloku i dytë i kodit.
#!/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 but anyway there is a directory under /home"
fi Në një skenar të tillë, mund të krijoni një përdorues të ri me komandën useradd, nëse kërkimi nuk ka dhënë rezultate, ose të bëni diçka tjetër të dobishme.
Krahasimi i numrave
Në skripte, është e mundur të krahasohen vlerat numerike. Më poshtë është lista e komandave përkatëse.
n1 -eq n2Kthen një vlerë të vërtetë nësen1është e barabartë men2.
n1 -ge n2Kthen një vlerë të vërtetë nësen1më shumë ose e barabartën2.
n1 -gt n2Kthen një vlerë të vërtetë nësen1më shumën2.
n1 -le n2Kthen një vlerë të vërtetë nësen1më pak ose e barabartën2.
n1 -lt n2Kthen një vlerë të vërtetë nëse n1 është më pakn2.
n1 -ne n2Kthen një vlerë të vërtetë nësen1nuk është e barabartën2.
Si një shembull, le të provojmë një nga operatorët e krahasimit. Kushtojini vëmendje se shprehja është e mbyllur në kllapa.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiJa çfarë do të nxjerrë kjo komandë.

Krahasimi i numrave në skripte
Vlera e variables val1më shumë se 5, kështu që ekzekutohet dega thene operatorit të krahasimit dhe në konsolë shfaqet një mesazh përkatës.
Krahasimi i stringjeve
Në skenarë, mund të krahasohen edhe vlera stringjore. Operatorët e krahasimit duken mjaft të thjeshtë, megjithatë, operacionet e krahasimit të stringjeve kanë disa veçori të caktuara, të cilat do t'i trajtojmë më poshtë. Ja lista e operatorëve.
str1 = str2Kontrollon stringjet për barazim, kthen të vërtetë nëse stringjet janë identike.
str1 != str2Kthen të vërtetë nëse stringjet nuk janë identike.
str1 < str2Kthen të vërtetë nësestr1është më pak sestr2.
str1 > str2Kthen të vërtetë nësestr1më shumë sestr2.
-n str1Kthen të vërtetë nëse gjatësiastr1është më e madhe se zero.
-z str1Kthen të vërtetë nëse gjatësiastr1është e barabartë me zero.
Ja një shembull i krahasimit të stringjeve në skenar.
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fiSi rezultat i ekzekutimit të skriptit do të marrim këtë.

Krahasimi i stringjeve në skripte
Ja njĂ« veçori e krahasimit tĂ« vargjeve qĂ« meriton tĂ« pĂ«rmendet. SaktĂ«sisht, operatorĂ«t â>â dhe ââ si njĂ« komandĂ« pĂ«r derdhjen e daljes.
Ja si duket puna me këta operatorë në kod:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiJa rezultatet e punës së skriptit.

Krahasimi i vargjeve, paralajmërimi i dhënë
Vini re se, megjithëse skripti ekzekutohet, ai jep një paralajmërim:
./myscript: line 5: [: shumë argumente Për të hequr këtë paralajmërim, do të vendosim $val2 në dyfish
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiTani gjithçka funksionon siç duhet.

Krahasimi i stringjeve
NjĂ« tjetĂ«r veçori e operatorĂ«ve â>â dhe â<â Ă«shtĂ« se si ata punojnĂ« me shkronjat me shkronja tĂ« mĂ«dha dhe tĂ« vogla. PĂ«r tĂ« kuptuar kĂ«tĂ« veçori, le tĂ« pĂ«rgatisim njĂ« skedar teksti me kĂ«tĂ« pĂ«rmbajtje:
Likegeeks
likegeeks Ta ruajmë atë, duke i dhënë emrin myfile, pas së cilës do të ekzekutojmë këtë komandë në terminal:
sort myfileAi do të rendisë vargjet nga skedari kështu:
likegeeks
Likegeeks Ekipa sort, nga e para, rendit radhët në rend rritës, domethënë një shkronjë të vogël në shembullin tonë është më e vogël se një shkronjë e madhe. Tani përgatitim skenarin që do të krahasojë të njëjtat radhë:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiNĂ«se e ekzekutojmĂ«, do tĂ« dalĂ« se gjithçka Ă«shtĂ« e kundĂ«rta â tani shkronja e vogĂ«l Ă«shtĂ« mĂ« e madhe se shkronja e madhe.

Komanda sort dhe krahasimi i radhëve në skenarin
Në komandat e krahasimit, shkronjat e mëdha janë më të vogla se ato të vogla. Krahasimi i radhëve këtu realizohet duke krahasuar kodet ASCII të simboleve, prandaj rendi i renditjes varet nga kodet e simboleve.
Ekipa sort, nga ana tjetër, përdor rendin e renditjes së përcaktuar në cilësimet e gjuhës së sistemit.
Kontrolli i skedarëve
Ndoshta, komandat më poshtë përdoren më shpesh në skenaret bash. Ato lejojnë të kontrollohen kushte të ndryshme në lidhje me skedarët. Ja lista e këtyre komandave.
-d fileKontrollon nëse skedari ekziston dhe nëse është një direktor.
-e fileKontrollon nëse skedari ekziston.
-f fileKontrollon nëse skedari ekziston dhe nëse është një skedar.
-r fileKontrollon nëse skedari ekziston dhe nëse mund të lexohet.
-s filekontrollon nëse skedari ekziston dhe nuk është i zbrazët.
-w fileKontrollon nëse një skedar ekziston dhe nëse është i shkruajtshëm.
-x fileKontrollon nëse një skedar ekziston dhe nëse është ekzekutues.
file1 -nt file2Kontrollon nëse është më i ri sefile1, sefile2.
file1 -ot file2Kontrollon nëse është më i vjetër sefile1, sefile2.
-O fileKontrollon nëse një skedar ekziston dhe nëse ai është pronari aktual i përdoruesit.
-G fileKontrollon nëse një skedar ekziston dhe nëse identifikuesi i grupit të tij përputhet me identifikuesin e grupit të përdoruesit aktual.
Këto komandat, si dhe shumë të tjera të diskutuar sot, janë lehtësisht për t'u mbajtur mend. Emrat e tyre, duke qenë shkurtore të fjalëve të ndryshme, tregojnë drejtpërdrejt verifikimet që ata kryejnë.
Le të provojmë një nga komandat në praktikë:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiKy skenar, për një drejtor të ekzistueshëm, do të shfaqë përmbajtjen e saj.

Shfaqja e përmbajtjes së drejtorisë
Mendojmë se me komandat e tjera do të jeni në gjendje të eksperimentoni vetë, të gjitha ato përdoren sipas të njëjtit parim.
Përfundimet
Sot folĂ«m pĂ«r si tĂ« filloni me shkrimin e skripteve bash dhe shqyrtuam disa gjĂ«ra bazike. NĂ« tĂ« vĂ«rtetĂ«, tema e programimit nĂ« bash Ă«shtĂ« e gjerĂ«. Ky artikull Ă«shtĂ« njĂ« pĂ«rkthim i pjesĂ«s sĂ« parĂ« tĂ« njĂ« serie tĂ« madhe me 11 materiale. NĂ«se dĂ«shironi vazhdimin tani â ja lista e origjinaleve tĂ« kĂ«tyre materialeve. PĂ«r lehtĂ«sinĂ« e lexuesve, pĂ«rfshihet gjithashtu edhe ai, pĂ«rkthimi i tĂ« cilit sapo lexuat.
- â kĂ«tu flitet pĂ«r si tĂ« filloni krijimin e skripteve bash, shqyrtohet pĂ«rdorimi i variablave, pĂ«rshkruhen konstruksionet kushtore, llogaritjet, krahasimet e numrave, vargjeve, tĂ« dhĂ«nave mbi skedarĂ«t.
- â kĂ«tu zbulohet karakteristikat e punĂ«s me ciklet for dhe while.
- â ky material Ă«shtĂ« dedikuar parametrave tĂ« komandĂ«s dhe çelĂ«save qĂ« mund tĂ« kalohen nĂ« skripte, punĂ«s me tĂ« dhĂ«nat qĂ« fut pĂ«rdoruesi, dhe qĂ« mund tĂ« lexohen nga skedarĂ«t.
- â kĂ«tu flitet pĂ«r descriptorĂ«t e skedarĂ«ve dhe punĂ«n me ta, pĂ«r rrjedhjet e hyrjes, daljes, gabimeve, pĂ«r ridrejtimin e daljes.
- â ky material i dedikuar sinjaleve tĂ« Linux, procesimit tĂ« tyre nĂ« skripte, dhe ekzekutimit tĂ« skenarĂ«ve sipas njĂ« orari.
- â kĂ«tu mund tĂ« mĂ«soni pĂ«r krijimin dhe pĂ«rdorimin e funksioneve nĂ« skripte, si dhe pĂ«r zhvillimin e bibliotekave.
- â ky artikull Ă«shtĂ« i dedikuar punĂ«s me redaktorin e tekstual sed.
- â ky material Ă«shtĂ« i dedikuar programimit nĂ« gjuhĂ«n e pĂ«rpunimit tĂ« tĂ« dhĂ«nave awk.
- â kĂ«tu mund tĂ« lexoni rreth pĂ«rdorimit tĂ« shprehjeve rregullore nĂ« skriptet bash.
- â kĂ«tu janĂ« teknikĂ« tĂ« punĂ«s me mesazhe qĂ« mund tĂ« dĂ«rgoni pĂ«rdoruesve, si dhe metodologjia pĂ«r monitorimin e diskut.
- â ky material Ă«shtĂ« i dedikuar mjetit Expect, me anĂ« tĂ« sĂ« cilĂ«s mund tĂ« automatizoni ndĂ«rveprimin me utilitarĂ«t interaktivĂ«. NĂ« veçanti, kĂ«tu flitet pĂ«r skriptet expect dhe ndĂ«rveprimin e tyre me skriptet bash dhe programe tĂ« tjera.
Mendojmë se një nga vlerat e çmuara të kësaj serie artikujsh është se ajo, duke nisur nga e thjeshta, e përshtatshme për përdoruesit e çdo niveli, gradualisht kalon në tema më serioze, duke ofruar një mundësi për të gjithë ata që dëshirojnë të avancojnë në krijimin e skenarëve të linjës së komandës në Linux.
Të nderuar lexues! Ju lutemi guru të programimit bash të ndajnë se si arritën majat e mjeshtërive, të ndajnë sekretet e tyre, dhe prej atyre që sapo kanë shkruar skenarin e tyre të parë, presim përshtypjet.
Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. , ju lutemi.
Të përkthejmë pjesët e tjera të ciklit të artikujve?
Po!
Jo, nuk është e nevojshme
1030 përdorues kanë votuar. 106 përdorues abstenuan.
Burimi: habr.com
