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.