Si të kontrolloni nëse ekziston një skedar në skriptet e Linux Bash
Nëse një skrip Linux Bash mbështetet në praninë e skedarëve ose drejtorive të caktuara, nuk mund të supozohet se ato janë të pranishme. Duhet të kontrollohet nëse ato janë patjetër të pranishme. Ja se si ta bëni këtë.
Mos Supozoni Asgjë
Kur jeni duke shkruar një skenar, nuk mund të bëni supozime për atë që është dhe çfarë nuk është e pranishme në një kompjuter. Kjo është dyfish e vërtetë nëse skripti do të shpërndahet dhe do të ekzekutohet në shumë kompjuterë të ndryshëm. Herët a vonë, skripti do të ekzekutohet në një kompjuter që nuk i plotëson supozimet tuaja dhe skripti do të dështojë ose do të funksionojë në mënyrë të paparashikueshme.
Çdo gjë që vlerësojmë ose krijojmë në një kompjuter ruhet në një skedar të një formati dhe të gjithë ata skedarë qëndrojnë në një direktori. Skriptet mund të lexojnë, shkruajnë, riemërtojnë, fshijnë dhe zhvendosin skedarët dhe drejtoritë - të gjitha gjërat që mund të bëni në vijën e komandës.
Avantazhi që keni si njeri është se ju mund të shihni përmbajtjen e një drejtorie dhe ju e dini nëse një skedar ekziston apo jo - ose nëse drejtoria e pritshme ekziston. Nëse një skript prishet kur manipulon skedarë, mund të ketë rezultate serioze dhe të dëmshme.
Bash ofron një grup gjithëpërfshirës testesh që mund t'i përdorni për të zbuluar skedarët dhe drejtoritë dhe për të testuar për shumë nga atributet e tyre. Përfshirja e këtyre në skriptet është e lehtë, por përfitimet për sa i përket qëndrueshmërisë dhe kontrollit të mirë janë të konsiderueshme.
Gama e Testeve
Duke kombinuar deklaratën if me testin e duhur nga një koleksion i madh i testeve të skedarëve dhe drejtorive, ne mund të përcaktojmë lehtësisht nëse ekziston një skedar, nëse është i ekzekutueshëm ose i shkruajtshëm dhe shumë më tepër.
- -b: Kthehet e vërtetë nëse skedari është një skedar i veçantë blloku.
- -c: Kthehet e vërtetë nëse skedari është karakteristik i veçantë.
- -d: Kthehet e vërtetë nëse skedari është një direktori.
- -e: Kthehet e vërtetë nëse skedari ekziston.
- -f: Kthehet e vërtetë nëse skedari ekziston dhe është një skedar i rregullt.
- -g: Kthehet e vërtetë nëse skedari ka grupin e lejeve
setgid
(chmod g+
). - -h: Kthehet e vërtetë nëse skedari është një lidhje simbolike.
- -L: Kthehet e vërtetë nëse skedari është një lidhje simbolike.
- -k: Kthehet e vërtetë nëse biti ngjitës është vendosur (
chmod +t
). - -p: Kthehet e vërtetë nëse skedari është një tub me emër.
- -r: Kthehet e vërtetë nëse skedari është i lexueshëm.
- -s: Kthehet e vërtetë nëse skedarët ekzistojnë dhe nuk janë bosh.
- -S: Kthehet e vërtetë nëse skedari është fole.
- -t: Kthehet e vërtetë nëse përshkruesi i skedarit hapet në një terminal.
- -u: Kthehet e vërtetë nëse skedari ka grupin e lejeve
setuid
(chmod u+
). - -w: Kthehet e vërtetë nëse skedari është i shkruhet.
- -x: Kthehet e vërtetë nëse skedari është i ekzekutueshëm.
- -O: Kthehet e vërtetë nëse është në pronësi të jush.
- -G: Kthehet e vërtetë nëse është në pronësi të grupit tuaj.
- -N: Kthehet e vërtetë nëse skedari është modifikuar që nga leximi i fundit.
- !: Operatori logjik NOT.
- &&: Operatori logjik AND.
- ||: Operatori logjik OSE.
Lista fillon me -b
sepse testi -a
është zhvlerësuar dhe është zëvendësuar nga testi -e
.
Përdorimi i Testeve në Skripta
Deklarata e testit të skedarit të përgjithshëm if
është një konstrukt i thjeshtë skriptimi. Krahasimi brenda kllapave të dyfishta ” [[ ]]
” përdor testin -f
për të përcaktuar nëse ekziston një skedar i rregullt me atë emër.
Kopjojeni tekstin e këtij skripti në një redaktues dhe ruajeni në një skedar të quajtur script1.sh dhe përdorni chmod
për ta bërë atë të ekzekutueshëm.
#!/bin/bash
if [[ -f $1 ]]
then
echo "The file $1 exists."
else
echo "The file $1 cannot be found."
fi
Ju duhet t'i kaloni emrin e skedarit skriptit në vijën e komandës.
chmod +x script1.sh
Ju do të duhet ta bëni këtë me secilin skenar nëse dëshironi të provoni shembujt e tjerë nga artikulli.
Le të provojmë skriptin në një skedar teksti të drejtpërdrejtë.
./script1.sh test-file.txt
Skedari ekziston dhe skripti e raporton saktë këtë fakt. Nëse e fshijmë skedarin dhe provojmë përsëri, testi duhet të dështojë dhe skripti duhet ta raportojë këtë tek ne.
./script1.sh test-file.txt
Në një situatë të jetës reale, skenari juaj do të duhet të ndërmarrë çfarëdo veprimi që ishte i përshtatshëm. Ndoshta e shënon gabimin dhe ndalon. Ndoshta krijon skedarin dhe vazhdon. Mund të kopjojë diçka nga një direktori rezervë për të zëvendësuar skedarin që mungon. E gjitha varet nga qëllimi i skenarit. Por të paktën tani skenari është në gjendje të marrë vendimin bazuar në njohjen nëse skedari është i pranishëm apo jo.
Flamuri -f
teston nëse skedari është i pranishëm dhe është një skedar i rregullt. Me fjalë të tjera, nuk është diçka që duket të jetë një skedar, por nuk është, siç është skedari i pajisjes.
Ne do të përdorim ls për të verifikuar që skedari /dev/random ekziston dhe më pas do të shohim se çfarë bën skripti prej tij.
ls -lh /dev/random
./script /dev/random
Për shkak se skripti ynë po teston për skedarë të rregullt dhe /dev/random është një skedar pajisjeje, testi dështon. Shumë shpesh, për të kuptuar nëse ekziston një skedar, duhet të zgjidhni me kujdes se cilin test përdorni, ose duhet të përdorni disa teste.
Ky është script2.sh, i cili teston për skedarë të rregullt dhe për skedarë të pajisjes me karakter.
#!/bin/bash
if [[ -f $1 ]]
then
echo "The file $1 exists."
else
echo "The file $1 is missing or not a regular file."
fi
if [[ -c $1 ]]
then
echo "The file $1 is a character device file."
else
echo "The file $1 is missing or not a special file."
fi
Nëse e ekzekutojmë këtë skript në skedarin e pajisjes “/dev/random”, testi i parë dështon siç presim, dhe testi i dytë ka sukses. Ai e njeh skedarin si skedar pajisjeje.
./script2.sh /dev/random
Në fakt, ai e njeh atë si një skedar pajisjeje karakteri. Disa skedarë pajisjesh janë skedarë të bllokuar të pajisjes. Siç qëndron, skenari ynë nuk do t'i përballojë ato.
./script2.sh /dev/sda
Ne mund të përdorim operatorin logjik OR
dhe të përfshijmë një test tjetër në deklaratën e dytë if. Këtë herë, nëse skedari është skedar i pajisjes me karakter ose një skedar bllokimi i pajisjes, testi do të kthehet i vërtetë. Ky është script3.sh.
#!/bin/bash
if [[ -f $1 ]]
then
echo "The file $1 exists."
else
echo "The file $1 is missing or not a regular file."
fi
if [[ -c $1 || -b $1 ]]
then
echo "The file $1 is a character or block device file."
else
echo "The file $1 is missing or not a special file."
fi
Ky skrip njeh si pajisjen e karaktereve ashtu edhe skedarët e bllokut të pajisjes.
./script3.sh /dev/random
./script3.sh /dev/sda
Nëse është e rëndësishme për ju të bëni dallimin midis llojeve të ndryshme të skedarëve të pajisjes, mund të përdorni deklarata të ndërlidhura if
. Ky është script4.sh.
#!/bin/bash
if [[ -f $1 ]]
then
echo "The file $1 exists."
else
echo "The file $1 is missing or not a regular file."
fi
if [[ -c $1 ]]
then
echo "The file $1 is a character device file."
else
if [[ -b $1 ]]
then
echo "The file $1 is a block device file."
else
echo "The file $1 is missing or not a device file."
fi
fi
Ky skript njeh dhe kategorizon skedarët e pajisjes me karakter dhe bllokun e pajisjes.
./script4.sh /dev/random
./script4.sh /dev/sda
Duke përdorur operatorin logjik AND ne mund të testojmë për disa karakteristika njëherësh. Ky është script5.sh. Kontrollon nëse ekziston një skedar dhe skripti ka lexuar dhe lejet e shkrimit për të.
#!/bin/bash
if [[ -f $1 && -r $1 && -w $1 ]]
then
echo "The file $1 exists and we have read/write permissions."
else
echo "The file $1 is missing, not a regular file, or we can't read/write to it."
fi
Ne do ta ekzekutojmë skriptin në një skedar që na përket neve dhe një që i përket root
.
./script5.sh .bashrc
./script5.sh /etc/fstab
Për të testuar ekzistencën e një drejtorie, përdorni testin -d
. Ky është script6.sh. Është pjesë e një skripti rezervë. Gjëja e parë që bën është të kontrollojë nëse drejtoria e kaluar në vijën e komandës ekziston apo jo. Ai përdor operatorin logjik NOT
!
në testin e deklaratës if
.
#!/bin/bash
if [[ ! -d $1 ]]
then
echo "Creating backup directory:" $1
mkdir $1
if [[ ! $? -eq 0 ]]
then
echo "Couldn't create backup directory:" $1
exit
fi
else
echo "Backup directory exists."
fi
# continue with file backup
echo "Backing up to: "$1
Nëse drejtoria nuk ekziston, ai e krijon atë. Nëse skedarët e krijimit të drejtorisë, skripti del. Nëse krijimi i drejtorisë ka sukses, ose drejtoria ekziston tashmë, skripti vazhdon me veprimet e tij rezervë.
Do të ekzekutojmë skriptin dhe më pas do të kontrollojmë me ls
dhe opsionin -d
(directory) nëse ekziston direktoria rezervë.
./script6.sh Documents/project-backup
ls -d Documents/project-backup
U krijua drejtoria rezervë. Nëse e ekzekutojmë skriptin përsëri, ai duhet të raportojë se drejtoria është tashmë e pranishme.
./script6.sh
Skripti gjen direktoriumin dhe vazhdon për të kryer kopjen rezervë.
Testoni, mos supozoni
Herët a vonë, supozimet do të çojnë në gjëra të këqija. Testoni fillimisht dhe reagoni në përputhje me rrethanat.
Njohuria është fuqi. Përdorni teste për t'u dhënë skripteve tuaja njohuritë që u nevojiten.