Bash shift iebūvēta komanda

maiņas komanda

Ieslēgts Līdzīgi Unix operētājsistēmas, maiņa ir iebūvēta komanda Bash apvalks. Kad tas tiek izpildīts, tas pārvieto pozicionālie parametri (piemēram, argumenti, kas nodoti bash scenārijs ) pa kreisi, katru parametru novietojot zemākā pozīcijā.

Apraksts

Kad tu skrien maiņa , pašreizējie pozicionēšanas parametri ir nobīdīti pa kreisi n reizes. Pozicionālais parametrs x tiek piešķirta parametra vērtība x + n . Ja parametrs x + n neeksistē, parametrs x ir nenoteikts .



Ja nav norādīts, noklusējuma vērtība n ir 1 . Tātad komandas 1. maiņa ' un ' maiņa '(bez argumentiem) dara to pašu.

Ja parametrs tiek novirzīts uz pozīciju, kuras skaitlis ir mazāks par 1, tas “nokrīt” - tā vērtība tiek izmesta. Tātad komanda maiņa vienmēr izmet iepriekšējo vērtību 1 USD , un 2. maiņa vienmēr atmet iepriekšējās vērtības 1 USD un 2 USD .

Īpašais pozicionālais parametrs 0 USD nav izslēgts no visām maiņu operācijām un to nekad nemaina maiņa komandu.



Sintakse

  shift  [  n  ]

The maiņa komandai nepieciešams tikai viens arguments:

n Pozīciju skaits, kuru parametri jāpārvieto pa kreisi. Šī vērtība var būt jebkurš nenegatīvs vesels skaitlis. Ja n ir nulle ( 0 ), parametru maiņa netiks veikta. Noklusējuma vērtība n ir 1 .

Iziet no statusa

Kad maiņa iziet, tas atgriež izejas statusu 0 (nav kļūdas), ja vien: n ir negatīva, vai n ir lielāks par pašreizējo pozicionālo parametru skaitu, šajā gadījumā izejas statuss ir nulle.

Pozicionālie parametri bash

Bashā, kad komanda tiek izpildīta, šīs komandas vide ietver īpašus mainīgos, kas satur komandai piešķirtos individuālos parametrus.



Šo mainīgo nosaukums ir skaitlis, kas atbilst šī parametra pozīcijai komandrindā.

Piemēram, apsveriet šādu komandu:

mv file_old.txt file_new.txt

Šai komandai ir trīs pozīcijas parametri, kas numurēti šādi:

Parametrs Pozīcija Apraksts
mv 0 The mv komanda , kas pārvieto failus. Šajā gadījumā tas tiek pārdēvēts file_old.txt uz file_new.txt “pārvietojot” to uz jauno faila nosaukums .
file_old.txt 1 Sākotnējais faila nosaukums.
file_new.txt divi Jaunais faila nosaukums.

Pirmais parametrs, 0 , satur komandas nosaukumu. Ja argumentu nav, tas būs vienīgais pozīcijas parametrs.

Kad pēc komandas tiek iekļauti argumenti, katrs no tiem tiek saglabāts nosauktajos čaulas mainīgajos 1 , divi Tāpat kā uz visiem citiem čaulas mainīgajiem, uz to vērtību var atsaukties, pirms mainīgā nosaukuma ievietojot dolāra zīmi. Tātad pozicionālā parametra vērtība 1 var atsaukties ar 1 USD , parametra vērtība divi var atsaukties ar 2 USD utt.

Parametri ar skaitli 10 vai lielāku var atsaukties, ievietojot skaitli iekavās, piemēram {10} USD , {11} USD vai {12345} USD .

Bašs seko līdzi kopējam pozīcijas parametru skaitam. Šis numurs tiek saglabāts īpašajā čaulas mainīgajā $ # .

Vērtība $ # samazinās par n katru reizi, kad skrien maiņa .

Īpašs pozicionālais parametrs nulle

Pozicionālais parametrs nulle ( 0 ) satur komandas nosaukumu, kas tika izmantota pašreizējā procesa sākšanai, tiklīdz tā tika izpildīta. Pārbaudot šī mainīgā vērtību, vienmēr varat uzzināt, kāda komanda tika izmantota pašreizējā procesa uzsākšanai.

Piemēram: no bash uzvednes varat palaist atbalss $ 0 lai redzētu komandu, kas palaida jūsu pašreizējo bash sesiju:

echo id="texttext">
					

Bash shift iebūvēta komanda

maiņas komanda

Ieslēgts Līdzīgi Unix operētājsistēmas, maiņa ir iebūvēta komanda Bash apvalks. Kad tas tiek izpildīts, tas pārvieto pozicionālie parametri (piemēram, argumenti, kas nodoti bash scenārijs ) pa kreisi, katru parametru novietojot zemākā pozīcijā.

Apraksts

Kad tu skrien maiņa , pašreizējie pozicionēšanas parametri ir nobīdīti pa kreisi n reizes. Pozicionālais parametrs x tiek piešķirta parametra vērtība x + n . Ja parametrs x + n neeksistē, parametrs x ir nenoteikts .



Ja nav norādīts, noklusējuma vērtība n ir 1 . Tātad komandas 1. maiņa ' un ' maiņa '(bez argumentiem) dara to pašu.

Ja parametrs tiek novirzīts uz pozīciju, kuras skaitlis ir mazāks par 1, tas “nokrīt” - tā vērtība tiek izmesta. Tātad komanda maiņa vienmēr izmet iepriekšējo vērtību 1 USD , un 2. maiņa vienmēr atmet iepriekšējās vērtības 1 USD un 2 USD .

Īpašais pozicionālais parametrs 0 USD nav izslēgts no visām maiņu operācijām un to nekad nemaina maiņa komandu.



Sintakse

  shift  [  n  ]

The maiņa komandai nepieciešams tikai viens arguments:

n Pozīciju skaits, kuru parametri jāpārvieto pa kreisi. Šī vērtība var būt jebkurš nenegatīvs vesels skaitlis. Ja n ir nulle ( 0 ), parametru maiņa netiks veikta. Noklusējuma vērtība n ir 1 .

Iziet no statusa

Kad maiņa iziet, tas atgriež izejas statusu 0 (nav kļūdas), ja vien: n ir negatīva, vai n ir lielāks par pašreizējo pozicionālo parametru skaitu, šajā gadījumā izejas statuss ir nulle.

Pozicionālie parametri bash

Bashā, kad komanda tiek izpildīta, šīs komandas vide ietver īpašus mainīgos, kas satur komandai piešķirtos individuālos parametrus.



Šo mainīgo nosaukums ir skaitlis, kas atbilst šī parametra pozīcijai komandrindā.

Piemēram, apsveriet šādu komandu:

mv file_old.txt file_new.txt

Šai komandai ir trīs pozīcijas parametri, kas numurēti šādi:

Parametrs Pozīcija Apraksts
mv 0 The mv komanda , kas pārvieto failus. Šajā gadījumā tas tiek pārdēvēts file_old.txt uz file_new.txt “pārvietojot” to uz jauno faila nosaukums .
file_old.txt 1 Sākotnējais faila nosaukums.
file_new.txt divi Jaunais faila nosaukums.

Pirmais parametrs, 0 , satur komandas nosaukumu. Ja argumentu nav, tas būs vienīgais pozīcijas parametrs.

Kad pēc komandas tiek iekļauti argumenti, katrs no tiem tiek saglabāts nosauktajos čaulas mainīgajos 1 , divi Tāpat kā uz visiem citiem čaulas mainīgajiem, uz to vērtību var atsaukties, pirms mainīgā nosaukuma ievietojot dolāra zīmi. Tātad pozicionālā parametra vērtība 1 var atsaukties ar 1 USD , parametra vērtība divi var atsaukties ar 2 USD utt.

Parametri ar skaitli 10 vai lielāku var atsaukties, ievietojot skaitli iekavās, piemēram {10} USD , {11} USD vai {12345} USD .

Bašs seko līdzi kopējam pozīcijas parametru skaitam. Šis numurs tiek saglabāts īpašajā čaulas mainīgajā $ # .

Vērtība $ # samazinās par n katru reizi, kad skrien maiņa .

Īpašs pozicionālais parametrs nulle

Pozicionālais parametrs nulle ( 0 ) satur komandas nosaukumu, kas tika izmantota pašreizējā procesa sākšanai, tiklīdz tā tika izpildīta. Pārbaudot šī mainīgā vērtību, vienmēr varat uzzināt, kāda komanda tika izmantota pašreizējā procesa uzsākšanai.

Piemēram: no bash uzvednes varat palaist atbalss $ 0 lai redzētu komandu, kas palaida jūsu pašreizējo bash sesiju:

echo $0
/bin/bash

Šī ir bash atrašanās vieta izpildāms .

Tomēr ir dažādi veidi, kā palaist izpildāmo failu - piemēram, daudzas programmas tiek izpildītas, izmantojot a simlink (simboliska saite). Ja palaižat komandu, izmantojot simbolu saiti, 0 USD satur jūsu izmantotās saites nosaukumu.

Piemēram, varat izveidot saiti uz bash jūsu mājas direktorijā:

ln -s /bin/bash ~/mybash

Un padariet symlink izpildāmu, izmantojot chmod :

chmod u+x ~/mybash

Pēc tam jūs varat sākt jaunu mazu bērnu procesu, izpildot simlink:

~/mybash

Jūs tagad esat jaunā bash apvalkā, iepriekšējā čaulā. Ja skrien atbalss $ 0 , jūs redzēsiet atšķirību:

echo $0
/home/hope/mybash

Šis ir pilnīgs ceļš uz jūsu mājas direktoriju, kas ir paplašināts ar bash, kad izmantojāt aizstājvārdu ~ (uz akcentu atzīme ). Jūs varat rakstīt Izeja tagad, lai atgrieztos pie sava sākotnējā bash apvalka.

Piemēri

Pārslēgšanas parametri

Izveidosim skriptu, kas pieņem argumentus. Mēs apskatīsim, kā un kā argumenti tiek saglabāti vidē kā pozīcijas parametri maiņa ietekmē viņus.

Izveidojiet jaunu skriptu ar iecienītāko teksta redaktoru, piemēram, virsotne vai vim. Skriptam vajadzētu izskatīties šādi:

#!/bin/bash shift 0 echo 0: $0 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 

Pirmā rinda, kas sākas ar #! (a 'shebang') nosaka, kura čaulas programma jāizmanto, lai palaistu skriptu.

Otrā rinda (' maiņa 0 ') neko nedara - pagaidām. Pēc šāda skripta palaišanas mēs mainīsimies 0 uz citu numuru.

Tagad saglabājiet to failā ar nosaukumu myargs.sh un izejiet no teksta redaktora.

Veidot myargs.sh izpildāms:

chmod u+x ./myargs.sh

Pēc tam palaidiet to un norādiet dažus argumentus:

./myargs.sh one two three four five
0: ./myargs.sh 1: one 2: two 3: three 4: four

Šajā izvadē mēs varam redzēt pozicionālo parametru vērtības 0 - 4 . (Vērtība 5 USD ir ' pieci , taču šo vērtību mēs savā skriptā neizmantojam.)

Šīs vērtības ir raksturīgas mūsu pašreizējai komandai - skriptam. Kad skripts ir pabeigts, šīs vērtības pirms skripta palaišanas atgriežas savās vērtībās. Tātad tagad komandu uzvednē varat palaist:

echo $0, $1, $2, $3, $4.
/bin/bash, , , , .

Šīs ir mūsu bash sesijas vērtības. 0 USD ir izpildāmā bash atrašanās vieta, un pārējiem parametriem nav vērtības.

Tagad mainīsimies maiņa 0 uz 1. maiņa . Atveriet skriptu teksta redaktorā un nomainiet otro rindiņu, lai skripts izskatās šādi:

$!/bin/bash shift # same as shift 1 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4

Viss aiz jaukšanas zīmes (' # ') 2. līnijā ir a komentēt , un tiek ignorēts, kad skripts darbojas.

Saglabājiet failu un izejiet no teksta redaktora. Pēc tam vēlreiz palaidiet skriptu:

./myargs.sh one two three four five
0: ./myargs.sh 1: two 2: three 3: four 4: five

Ievērojiet, ka visu parametru pozīcija ir nobīdīta uz leju par vienu. Sākotnējā vērtība 1 USD tika izmests, un vērtība 5 USD tagad ir plkst 4 USD . Vērtība 0 USD nav mainījusies.

Bet, skrienot maiņa tikai vienu reizi nav ļoti noderīgi. Parasti jūs vēlaties to palaist vairākas reizes, ciklā. Mēs varam pārrakstīt iepriekš minēto skriptu kā cilpu, kur katra iterācija vienreiz maina parametrus. Teksta redaktorā mainiet skriptu, lai tas izskatās šādi:

#!/bin/bash for (( i = 0; i <= 4; i++ )); do echo Shifted $i time(s): echo ----------------- echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 echo shift done

Ievērojiet to maiņa ir pēdējā komanda cilpā. Tas ļauj mums kaut ko darīt attiecībā uz parametriem, pirms tie tiek pārvietoti. Tad kā pēdējo soli mēs mainām parametrus un atkal palaižam cilpu.

Saglabājiet izmaiņas, izejiet no teksta redaktora un palaidiet skriptu. Tas izveidosies piecas reizes (ar i palielinot no 0 uz 4 , vienu reizi cilpā). Katra cilpa vienu reizi novirzīs vērtības un atbalsīs vērtības 0 - 4 līdz terminālim.

./myargs.sh one two three four five
Shifted 0 time(s): ------------------ 1: one 2: two 3: three 4: four Shifted 1 time(s): ------------------ 1: two 2: three 3: four 4: five Shifted 2 time(s): ------------------ 1: three 2: four 3: five 4: Shifted 3 time(s): ------------------ 1: four 2: five 3: 4: Shifted 4 time(s): ------------------ 1: five 2: 3: 4:

Tagad, kad mēs esam redzējuši, kā parametri tiek pārvietoti, izveidosim skriptu ar praktisku mērķi.

Reālās pasaules piemērs

Šis skripts, clean-old-files.sh , pieņem sarakstu ar direktorijā nosaukumi kā parametri komandrindā. Katrā nosauktajā direktorijā tiek meklēti faili, kuriem nav piekļūts vairāk nekā gadu, un tie tiek izdzēsti.

#!/bin/bash # Scan directories for old files (over 365 days) and delete them. USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then # If zero arguments were supplied, echo 'Error: no directory names provided.' echo '$USAGE' # display a help message exit 1 # and return an error. fi while (( '$#' )); do # While there are arguments still to be shifted while IFS= read -r -d $'' file; do echo 'Removing $file...' rm $file done <<(find '$1' -type f -atime +365 -print0) shift done echo 'Done.' exit 0

Apskatīsim atsevišķas šī skripta daļas un analizēsim to darbību:

USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then echo 'Error: no directory names provided.' echo '$USAGE' exit 1 fi

Šajā ja nosacīts paziņojums , skripts pārbauda, ​​vai ir kādi argumenti. Pārbaudē tiek izmantots vienas iekavas apzīmējums ( [ & hellip; ] ), kas ir līdzvērtīgs iebūvētās komandas izmantošanai pārbaude . Īpašais čaulas mainīgais $ # tur kopējo pozīcijas parametru skaitu. Ja tā vērtība ir vienāda ar nulli, tas nozīmē, ka lietotājs nav norādījis direktoriju nosaukumus, tāpēc mēs atbalsojam palīdzības ziņojumu un skriptu pārtraucam ar kļūdu (izejas statuss 1 ).

while (( '$#' )); do

Pretējā gadījumā mēs ejam uz ārējo kamēr cilpa, kas izmanto dubultās iekavas novērtēšanu, lai redzētu, vai $ # ir taisnība - tas ir, ja tā vērtība ir kas cits kā nulle. Katru reizi, kad sākas cilpa, ja $ # ir nulle, izteiksme tiek vērtēta kā nepatiesa, un cilpa iziet.

Padoms

Izteiksmes (('$ #')) un ['$ #'! = '0'] dod līdzvērtīgus rezultātus un ir funkcionāli savstarpēji aizstājami.

Tālāk apskatīsim abas iekšējās cilpu puses:

 while IFS= read -r -d $'' file; do

Šajā rindā teikts: kamēr ir lasīt vienumi, kas ir norobežots ( -d ) ar nulles rakstzīmi ( $ ' 0' ), lasiet mainīgajā vienu vienumu failu , pēc tam izpildiet komandas cilpa iekšpusē.

Vienumus nodrošina rinda cilpas beigās:

 done <<(find '$1' -type f -atime +365 -print0)

Šajā rindā teikts: atrast visi faili, sākot meklēšanu direktorijā dir1 (pozicionālajā parametrā 1 USD ), kuriem pēdējo reizi piekļuva ( -laiks ) vairāk par ( + ) 365 dienas atpakaļ. Norobežojiet atbilstošo failu nosaukumu sarakstu ar nulles rakstzīmēm ( -druka0 ).

The atrast komanda ir pievienota <( & hellip; ) , kas izmanto procesa aizstāšana apstrādāt izvadi tā, it kā tas būtu fails. Šī faila saturs tiek novirzīts ( < ) uz iekšējo, kamēr cilpu. Tur, lasīt visu līdz nulles rakstzīmei interpretē kā nākamo faila nosaukumu un piešķir šim nosaukumam mainīgo failu . Pēc tam tiek izpildīta cilpas iekšpuse:

 echo 'Removing $file...' rm $file

Kurš izdrukā faila nosaukumu un noņem fails.

Iekšējā cilpa turpinās, līdz vairs nav failu nosaukumu, tātad lasīt atgriež false. Iekšējā cilpa iziet uz ārējo cilpu, kur mēs ...

 shift

maiņa pozicionēšanas parametrus tā, lai dir2 ( 2 USD ) ir tagad dir1 ( 1 USD ). Vecais 1 USD tiek izmests un $ # tiek automātiski samazināts par 1.

done

Atgriezieties ārējā sākumā kamēr cilpa. Ja pozīcijas parametru vairs nav, pārbaudiet (('$ #')) atgriež false, ārējā cilpa iziet un ...

echo 'Done.' exit 0

Mēs izejam ar panākumiem (izejas statuss 0 ).

Skripta palaišana izskatās šādi:

./clean-old-files.sh mydir1 mydir2
Removing mydir1/subdir1/Netscape-Navigator-1.0.zip... Removing mydir1/subdir2/my-soon-to-be-finished-novel.rtf... Removing mydir2/subdir1/grunge-the-new-phenomenon.doc... Removing mydir2/subdir2/my-geocities-page.htm... Removing mydir2/subdir3/half-life-2-leaked-beta.rar... Done.

getopts - Parsēšanas argumenti, kas nodoti čaulas skriptam.


/bin/bash

Šī ir bash atrašanās vieta izpildāms .

Tomēr ir dažādi veidi, kā palaist izpildāmo failu - piemēram, daudzas programmas tiek izpildītas, izmantojot a simlink (simboliska saite). Ja palaižat komandu, izmantojot simbolu saiti, 0 USD satur jūsu izmantotās saites nosaukumu.

Piemēram, varat izveidot saiti uz bash jūsu mājas direktorijā:

ln -s /bin/bash ~/mybash

Un padariet symlink izpildāmu, izmantojot chmod :

chmod u+x ~/mybash

Pēc tam jūs varat sākt jaunu mazu bērnu procesu, izpildot simlink:

~/mybash

Jūs tagad esat jaunā bash apvalkā, iepriekšējā čaulā. Ja skrien atbalss $ 0 , jūs redzēsiet atšķirību:

echo id="texttext">
					

Bash shift iebūvēta komanda

maiņas komanda

Ieslēgts Līdzīgi Unix operētājsistēmas, maiņa ir iebūvēta komanda Bash apvalks. Kad tas tiek izpildīts, tas pārvieto pozicionālie parametri (piemēram, argumenti, kas nodoti bash scenārijs ) pa kreisi, katru parametru novietojot zemākā pozīcijā.

Apraksts

Kad tu skrien maiņa , pašreizējie pozicionēšanas parametri ir nobīdīti pa kreisi n reizes. Pozicionālais parametrs x tiek piešķirta parametra vērtība x + n . Ja parametrs x + n neeksistē, parametrs x ir nenoteikts .



Ja nav norādīts, noklusējuma vērtība n ir 1 . Tātad komandas 1. maiņa ' un ' maiņa '(bez argumentiem) dara to pašu.

Ja parametrs tiek novirzīts uz pozīciju, kuras skaitlis ir mazāks par 1, tas “nokrīt” - tā vērtība tiek izmesta. Tātad komanda maiņa vienmēr izmet iepriekšējo vērtību 1 USD , un 2. maiņa vienmēr atmet iepriekšējās vērtības 1 USD un 2 USD .

Īpašais pozicionālais parametrs 0 USD nav izslēgts no visām maiņu operācijām un to nekad nemaina maiņa komandu.



Sintakse

  shift  [  n  ]

The maiņa komandai nepieciešams tikai viens arguments:

n Pozīciju skaits, kuru parametri jāpārvieto pa kreisi. Šī vērtība var būt jebkurš nenegatīvs vesels skaitlis. Ja n ir nulle ( 0 ), parametru maiņa netiks veikta. Noklusējuma vērtība n ir 1 .

Iziet no statusa

Kad maiņa iziet, tas atgriež izejas statusu 0 (nav kļūdas), ja vien: n ir negatīva, vai n ir lielāks par pašreizējo pozicionālo parametru skaitu, šajā gadījumā izejas statuss ir nulle.

Pozicionālie parametri bash

Bashā, kad komanda tiek izpildīta, šīs komandas vide ietver īpašus mainīgos, kas satur komandai piešķirtos individuālos parametrus.



Šo mainīgo nosaukums ir skaitlis, kas atbilst šī parametra pozīcijai komandrindā.

Piemēram, apsveriet šādu komandu:

mv file_old.txt file_new.txt

Šai komandai ir trīs pozīcijas parametri, kas numurēti šādi:

Parametrs Pozīcija Apraksts
mv 0 The mv komanda , kas pārvieto failus. Šajā gadījumā tas tiek pārdēvēts file_old.txt uz file_new.txt “pārvietojot” to uz jauno faila nosaukums .
file_old.txt 1 Sākotnējais faila nosaukums.
file_new.txt divi Jaunais faila nosaukums.

Pirmais parametrs, 0 , satur komandas nosaukumu. Ja argumentu nav, tas būs vienīgais pozīcijas parametrs.

Kad pēc komandas tiek iekļauti argumenti, katrs no tiem tiek saglabāts nosauktajos čaulas mainīgajos 1 , divi Tāpat kā uz visiem citiem čaulas mainīgajiem, uz to vērtību var atsaukties, pirms mainīgā nosaukuma ievietojot dolāra zīmi. Tātad pozicionālā parametra vērtība 1 var atsaukties ar 1 USD , parametra vērtība divi var atsaukties ar 2 USD utt.

Parametri ar skaitli 10 vai lielāku var atsaukties, ievietojot skaitli iekavās, piemēram {10} USD , {11} USD vai {12345} USD .

Bašs seko līdzi kopējam pozīcijas parametru skaitam. Šis numurs tiek saglabāts īpašajā čaulas mainīgajā $ # .

Vērtība $ # samazinās par n katru reizi, kad skrien maiņa .

Īpašs pozicionālais parametrs nulle

Pozicionālais parametrs nulle ( 0 ) satur komandas nosaukumu, kas tika izmantota pašreizējā procesa sākšanai, tiklīdz tā tika izpildīta. Pārbaudot šī mainīgā vērtību, vienmēr varat uzzināt, kāda komanda tika izmantota pašreizējā procesa uzsākšanai.

Piemēram: no bash uzvednes varat palaist atbalss $ 0 lai redzētu komandu, kas palaida jūsu pašreizējo bash sesiju:

echo $0
/bin/bash

Šī ir bash atrašanās vieta izpildāms .

Tomēr ir dažādi veidi, kā palaist izpildāmo failu - piemēram, daudzas programmas tiek izpildītas, izmantojot a simlink (simboliska saite). Ja palaižat komandu, izmantojot simbolu saiti, 0 USD satur jūsu izmantotās saites nosaukumu.

Piemēram, varat izveidot saiti uz bash jūsu mājas direktorijā:

ln -s /bin/bash ~/mybash

Un padariet symlink izpildāmu, izmantojot chmod :

chmod u+x ~/mybash

Pēc tam jūs varat sākt jaunu mazu bērnu procesu, izpildot simlink:

~/mybash

Jūs tagad esat jaunā bash apvalkā, iepriekšējā čaulā. Ja skrien atbalss $ 0 , jūs redzēsiet atšķirību:

echo $0
/home/hope/mybash

Šis ir pilnīgs ceļš uz jūsu mājas direktoriju, kas ir paplašināts ar bash, kad izmantojāt aizstājvārdu ~ (uz akcentu atzīme ). Jūs varat rakstīt Izeja tagad, lai atgrieztos pie sava sākotnējā bash apvalka.

Piemēri

Pārslēgšanas parametri

Izveidosim skriptu, kas pieņem argumentus. Mēs apskatīsim, kā un kā argumenti tiek saglabāti vidē kā pozīcijas parametri maiņa ietekmē viņus.

Izveidojiet jaunu skriptu ar iecienītāko teksta redaktoru, piemēram, virsotne vai vim. Skriptam vajadzētu izskatīties šādi:

#!/bin/bash shift 0 echo 0: $0 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 

Pirmā rinda, kas sākas ar #! (a 'shebang') nosaka, kura čaulas programma jāizmanto, lai palaistu skriptu.

Otrā rinda (' maiņa 0 ') neko nedara - pagaidām. Pēc šāda skripta palaišanas mēs mainīsimies 0 uz citu numuru.

Tagad saglabājiet to failā ar nosaukumu myargs.sh un izejiet no teksta redaktora.

Veidot myargs.sh izpildāms:

chmod u+x ./myargs.sh

Pēc tam palaidiet to un norādiet dažus argumentus:

./myargs.sh one two three four five
0: ./myargs.sh 1: one 2: two 3: three 4: four

Šajā izvadē mēs varam redzēt pozicionālo parametru vērtības 0 - 4 . (Vērtība 5 USD ir ' pieci , taču šo vērtību mēs savā skriptā neizmantojam.)

Šīs vērtības ir raksturīgas mūsu pašreizējai komandai - skriptam. Kad skripts ir pabeigts, šīs vērtības pirms skripta palaišanas atgriežas savās vērtībās. Tātad tagad komandu uzvednē varat palaist:

echo $0, $1, $2, $3, $4.
/bin/bash, , , , .

Šīs ir mūsu bash sesijas vērtības. 0 USD ir izpildāmā bash atrašanās vieta, un pārējiem parametriem nav vērtības.

Tagad mainīsimies maiņa 0 uz 1. maiņa . Atveriet skriptu teksta redaktorā un nomainiet otro rindiņu, lai skripts izskatās šādi:

$!/bin/bash shift # same as shift 1 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4

Viss aiz jaukšanas zīmes (' # ') 2. līnijā ir a komentēt , un tiek ignorēts, kad skripts darbojas.

Saglabājiet failu un izejiet no teksta redaktora. Pēc tam vēlreiz palaidiet skriptu:

./myargs.sh one two three four five
0: ./myargs.sh 1: two 2: three 3: four 4: five

Ievērojiet, ka visu parametru pozīcija ir nobīdīta uz leju par vienu. Sākotnējā vērtība 1 USD tika izmests, un vērtība 5 USD tagad ir plkst 4 USD . Vērtība 0 USD nav mainījusies.

Bet, skrienot maiņa tikai vienu reizi nav ļoti noderīgi. Parasti jūs vēlaties to palaist vairākas reizes, ciklā. Mēs varam pārrakstīt iepriekš minēto skriptu kā cilpu, kur katra iterācija vienreiz maina parametrus. Teksta redaktorā mainiet skriptu, lai tas izskatās šādi:

#!/bin/bash for (( i = 0; i <= 4; i++ )); do echo Shifted $i time(s): echo ----------------- echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 echo shift done

Ievērojiet to maiņa ir pēdējā komanda cilpā. Tas ļauj mums kaut ko darīt attiecībā uz parametriem, pirms tie tiek pārvietoti. Tad kā pēdējo soli mēs mainām parametrus un atkal palaižam cilpu.

Saglabājiet izmaiņas, izejiet no teksta redaktora un palaidiet skriptu. Tas izveidosies piecas reizes (ar i palielinot no 0 uz 4 , vienu reizi cilpā). Katra cilpa vienu reizi novirzīs vērtības un atbalsīs vērtības 0 - 4 līdz terminālim.

./myargs.sh one two three four five
Shifted 0 time(s): ------------------ 1: one 2: two 3: three 4: four Shifted 1 time(s): ------------------ 1: two 2: three 3: four 4: five Shifted 2 time(s): ------------------ 1: three 2: four 3: five 4: Shifted 3 time(s): ------------------ 1: four 2: five 3: 4: Shifted 4 time(s): ------------------ 1: five 2: 3: 4:

Tagad, kad mēs esam redzējuši, kā parametri tiek pārvietoti, izveidosim skriptu ar praktisku mērķi.

Reālās pasaules piemērs

Šis skripts, clean-old-files.sh , pieņem sarakstu ar direktorijā nosaukumi kā parametri komandrindā. Katrā nosauktajā direktorijā tiek meklēti faili, kuriem nav piekļūts vairāk nekā gadu, un tie tiek izdzēsti.

#!/bin/bash # Scan directories for old files (over 365 days) and delete them. USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then # If zero arguments were supplied, echo 'Error: no directory names provided.' echo '$USAGE' # display a help message exit 1 # and return an error. fi while (( '$#' )); do # While there are arguments still to be shifted while IFS= read -r -d $'' file; do echo 'Removing $file...' rm $file done <<(find '$1' -type f -atime +365 -print0) shift done echo 'Done.' exit 0

Apskatīsim atsevišķas šī skripta daļas un analizēsim to darbību:

USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then echo 'Error: no directory names provided.' echo '$USAGE' exit 1 fi

Šajā ja nosacīts paziņojums , skripts pārbauda, ​​vai ir kādi argumenti. Pārbaudē tiek izmantots vienas iekavas apzīmējums ( [ & hellip; ] ), kas ir līdzvērtīgs iebūvētās komandas izmantošanai pārbaude . Īpašais čaulas mainīgais $ # tur kopējo pozīcijas parametru skaitu. Ja tā vērtība ir vienāda ar nulli, tas nozīmē, ka lietotājs nav norādījis direktoriju nosaukumus, tāpēc mēs atbalsojam palīdzības ziņojumu un skriptu pārtraucam ar kļūdu (izejas statuss 1 ).

while (( '$#' )); do

Pretējā gadījumā mēs ejam uz ārējo kamēr cilpa, kas izmanto dubultās iekavas novērtēšanu, lai redzētu, vai $ # ir taisnība - tas ir, ja tā vērtība ir kas cits kā nulle. Katru reizi, kad sākas cilpa, ja $ # ir nulle, izteiksme tiek vērtēta kā nepatiesa, un cilpa iziet.

Padoms

Izteiksmes (('$ #')) un ['$ #'! = '0'] dod līdzvērtīgus rezultātus un ir funkcionāli savstarpēji aizstājami.

Tālāk apskatīsim abas iekšējās cilpu puses:

 while IFS= read -r -d $'' file; do

Šajā rindā teikts: kamēr ir lasīt vienumi, kas ir norobežots ( -d ) ar nulles rakstzīmi ( $ ' 0' ), lasiet mainīgajā vienu vienumu failu , pēc tam izpildiet komandas cilpa iekšpusē.

Vienumus nodrošina rinda cilpas beigās:

 done <<(find '$1' -type f -atime +365 -print0)

Šajā rindā teikts: atrast visi faili, sākot meklēšanu direktorijā dir1 (pozicionālajā parametrā 1 USD ), kuriem pēdējo reizi piekļuva ( -laiks ) vairāk par ( + ) 365 dienas atpakaļ. Norobežojiet atbilstošo failu nosaukumu sarakstu ar nulles rakstzīmēm ( -druka0 ).

The atrast komanda ir pievienota <( & hellip; ) , kas izmanto procesa aizstāšana apstrādāt izvadi tā, it kā tas būtu fails. Šī faila saturs tiek novirzīts ( < ) uz iekšējo, kamēr cilpu. Tur, lasīt visu līdz nulles rakstzīmei interpretē kā nākamo faila nosaukumu un piešķir šim nosaukumam mainīgo failu . Pēc tam tiek izpildīta cilpas iekšpuse:

 echo 'Removing $file...' rm $file

Kurš izdrukā faila nosaukumu un noņem fails.

Iekšējā cilpa turpinās, līdz vairs nav failu nosaukumu, tātad lasīt atgriež false. Iekšējā cilpa iziet uz ārējo cilpu, kur mēs ...

 shift

maiņa pozicionēšanas parametrus tā, lai dir2 ( 2 USD ) ir tagad dir1 ( 1 USD ). Vecais 1 USD tiek izmests un $ # tiek automātiski samazināts par 1.

done

Atgriezieties ārējā sākumā kamēr cilpa. Ja pozīcijas parametru vairs nav, pārbaudiet (('$ #')) atgriež false, ārējā cilpa iziet un ...

echo 'Done.' exit 0

Mēs izejam ar panākumiem (izejas statuss 0 ).

Skripta palaišana izskatās šādi:

./clean-old-files.sh mydir1 mydir2
Removing mydir1/subdir1/Netscape-Navigator-1.0.zip... Removing mydir1/subdir2/my-soon-to-be-finished-novel.rtf... Removing mydir2/subdir1/grunge-the-new-phenomenon.doc... Removing mydir2/subdir2/my-geocities-page.htm... Removing mydir2/subdir3/half-life-2-leaked-beta.rar... Done.

getopts - Parsēšanas argumenti, kas nodoti čaulas skriptam.


/home/hope/mybash

Šis ir pilnīgs ceļš uz jūsu mājas direktoriju, kas ir paplašināts ar bash, kad izmantojāt aizstājvārdu ~ (uz akcentu atzīme ). Jūs varat rakstīt Izeja tagad, lai atgrieztos pie sava sākotnējā bash apvalka.

Piemēri

Pārslēgšanas parametri

Izveidosim skriptu, kas pieņem argumentus. Mēs apskatīsim, kā un kā argumenti tiek saglabāti vidē kā pozīcijas parametri maiņa ietekmē viņus.

Izveidojiet jaunu skriptu ar iecienītāko teksta redaktoru, piemēram, virsotne vai vim. Skriptam vajadzētu izskatīties šādi:

#!/bin/bash shift 0 echo 0: id="texttext">
					

Bash shift iebūvēta komanda

maiņas komanda

Ieslēgts Līdzīgi Unix operētājsistēmas, maiņa ir iebūvēta komanda Bash apvalks. Kad tas tiek izpildīts, tas pārvieto pozicionālie parametri (piemēram, argumenti, kas nodoti bash scenārijs ) pa kreisi, katru parametru novietojot zemākā pozīcijā.

Apraksts

Kad tu skrien maiņa , pašreizējie pozicionēšanas parametri ir nobīdīti pa kreisi n reizes. Pozicionālais parametrs x tiek piešķirta parametra vērtība x + n . Ja parametrs x + n neeksistē, parametrs x ir nenoteikts .



Ja nav norādīts, noklusējuma vērtība n ir 1 . Tātad komandas 1. maiņa ' un ' maiņa '(bez argumentiem) dara to pašu.

Ja parametrs tiek novirzīts uz pozīciju, kuras skaitlis ir mazāks par 1, tas “nokrīt” - tā vērtība tiek izmesta. Tātad komanda maiņa vienmēr izmet iepriekšējo vērtību 1 USD , un 2. maiņa vienmēr atmet iepriekšējās vērtības 1 USD un 2 USD .

Īpašais pozicionālais parametrs 0 USD nav izslēgts no visām maiņu operācijām un to nekad nemaina maiņa komandu.



Sintakse

  shift  [  n  ]

The maiņa komandai nepieciešams tikai viens arguments:

n Pozīciju skaits, kuru parametri jāpārvieto pa kreisi. Šī vērtība var būt jebkurš nenegatīvs vesels skaitlis. Ja n ir nulle ( 0 ), parametru maiņa netiks veikta. Noklusējuma vērtība n ir 1 .

Iziet no statusa

Kad maiņa iziet, tas atgriež izejas statusu 0 (nav kļūdas), ja vien: n ir negatīva, vai n ir lielāks par pašreizējo pozicionālo parametru skaitu, šajā gadījumā izejas statuss ir nulle.

Pozicionālie parametri bash

Bashā, kad komanda tiek izpildīta, šīs komandas vide ietver īpašus mainīgos, kas satur komandai piešķirtos individuālos parametrus.



Šo mainīgo nosaukums ir skaitlis, kas atbilst šī parametra pozīcijai komandrindā.

Piemēram, apsveriet šādu komandu:

mv file_old.txt file_new.txt

Šai komandai ir trīs pozīcijas parametri, kas numurēti šādi:

Parametrs Pozīcija Apraksts
mv 0 The mv komanda , kas pārvieto failus. Šajā gadījumā tas tiek pārdēvēts file_old.txt uz file_new.txt “pārvietojot” to uz jauno faila nosaukums .
file_old.txt 1 Sākotnējais faila nosaukums.
file_new.txt divi Jaunais faila nosaukums.

Pirmais parametrs, 0 , satur komandas nosaukumu. Ja argumentu nav, tas būs vienīgais pozīcijas parametrs.

Kad pēc komandas tiek iekļauti argumenti, katrs no tiem tiek saglabāts nosauktajos čaulas mainīgajos 1 , divi Tāpat kā uz visiem citiem čaulas mainīgajiem, uz to vērtību var atsaukties, pirms mainīgā nosaukuma ievietojot dolāra zīmi. Tātad pozicionālā parametra vērtība 1 var atsaukties ar 1 USD , parametra vērtība divi var atsaukties ar 2 USD utt.

Parametri ar skaitli 10 vai lielāku var atsaukties, ievietojot skaitli iekavās, piemēram {10} USD , {11} USD vai {12345} USD .

Bašs seko līdzi kopējam pozīcijas parametru skaitam. Šis numurs tiek saglabāts īpašajā čaulas mainīgajā $ # .

Vērtība $ # samazinās par n katru reizi, kad skrien maiņa .

Īpašs pozicionālais parametrs nulle

Pozicionālais parametrs nulle ( 0 ) satur komandas nosaukumu, kas tika izmantota pašreizējā procesa sākšanai, tiklīdz tā tika izpildīta. Pārbaudot šī mainīgā vērtību, vienmēr varat uzzināt, kāda komanda tika izmantota pašreizējā procesa uzsākšanai.

Piemēram: no bash uzvednes varat palaist atbalss $ 0 lai redzētu komandu, kas palaida jūsu pašreizējo bash sesiju:

echo $0
/bin/bash

Šī ir bash atrašanās vieta izpildāms .

Tomēr ir dažādi veidi, kā palaist izpildāmo failu - piemēram, daudzas programmas tiek izpildītas, izmantojot a simlink (simboliska saite). Ja palaižat komandu, izmantojot simbolu saiti, 0 USD satur jūsu izmantotās saites nosaukumu.

Piemēram, varat izveidot saiti uz bash jūsu mājas direktorijā:

ln -s /bin/bash ~/mybash

Un padariet symlink izpildāmu, izmantojot chmod :

chmod u+x ~/mybash

Pēc tam jūs varat sākt jaunu mazu bērnu procesu, izpildot simlink:

~/mybash

Jūs tagad esat jaunā bash apvalkā, iepriekšējā čaulā. Ja skrien atbalss $ 0 , jūs redzēsiet atšķirību:

echo $0
/home/hope/mybash

Šis ir pilnīgs ceļš uz jūsu mājas direktoriju, kas ir paplašināts ar bash, kad izmantojāt aizstājvārdu ~ (uz akcentu atzīme ). Jūs varat rakstīt Izeja tagad, lai atgrieztos pie sava sākotnējā bash apvalka.

Piemēri

Pārslēgšanas parametri

Izveidosim skriptu, kas pieņem argumentus. Mēs apskatīsim, kā un kā argumenti tiek saglabāti vidē kā pozīcijas parametri maiņa ietekmē viņus.

Izveidojiet jaunu skriptu ar iecienītāko teksta redaktoru, piemēram, virsotne vai vim. Skriptam vajadzētu izskatīties šādi:

#!/bin/bash shift 0 echo 0: $0 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 

Pirmā rinda, kas sākas ar #! (a 'shebang') nosaka, kura čaulas programma jāizmanto, lai palaistu skriptu.

Otrā rinda (' maiņa 0 ') neko nedara - pagaidām. Pēc šāda skripta palaišanas mēs mainīsimies 0 uz citu numuru.

Tagad saglabājiet to failā ar nosaukumu myargs.sh un izejiet no teksta redaktora.

Veidot myargs.sh izpildāms:

chmod u+x ./myargs.sh

Pēc tam palaidiet to un norādiet dažus argumentus:

./myargs.sh one two three four five
0: ./myargs.sh 1: one 2: two 3: three 4: four

Šajā izvadē mēs varam redzēt pozicionālo parametru vērtības 0 - 4 . (Vērtība 5 USD ir ' pieci , taču šo vērtību mēs savā skriptā neizmantojam.)

Šīs vērtības ir raksturīgas mūsu pašreizējai komandai - skriptam. Kad skripts ir pabeigts, šīs vērtības pirms skripta palaišanas atgriežas savās vērtībās. Tātad tagad komandu uzvednē varat palaist:

echo $0, $1, $2, $3, $4.
/bin/bash, , , , .

Šīs ir mūsu bash sesijas vērtības. 0 USD ir izpildāmā bash atrašanās vieta, un pārējiem parametriem nav vērtības.

Tagad mainīsimies maiņa 0 uz 1. maiņa . Atveriet skriptu teksta redaktorā un nomainiet otro rindiņu, lai skripts izskatās šādi:

$!/bin/bash shift # same as shift 1 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4

Viss aiz jaukšanas zīmes (' # ') 2. līnijā ir a komentēt , un tiek ignorēts, kad skripts darbojas.

Saglabājiet failu un izejiet no teksta redaktora. Pēc tam vēlreiz palaidiet skriptu:

./myargs.sh one two three four five
0: ./myargs.sh 1: two 2: three 3: four 4: five

Ievērojiet, ka visu parametru pozīcija ir nobīdīta uz leju par vienu. Sākotnējā vērtība 1 USD tika izmests, un vērtība 5 USD tagad ir plkst 4 USD . Vērtība 0 USD nav mainījusies.

Bet, skrienot maiņa tikai vienu reizi nav ļoti noderīgi. Parasti jūs vēlaties to palaist vairākas reizes, ciklā. Mēs varam pārrakstīt iepriekš minēto skriptu kā cilpu, kur katra iterācija vienreiz maina parametrus. Teksta redaktorā mainiet skriptu, lai tas izskatās šādi:

#!/bin/bash for (( i = 0; i <= 4; i++ )); do echo Shifted $i time(s): echo ----------------- echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 echo shift done

Ievērojiet to maiņa ir pēdējā komanda cilpā. Tas ļauj mums kaut ko darīt attiecībā uz parametriem, pirms tie tiek pārvietoti. Tad kā pēdējo soli mēs mainām parametrus un atkal palaižam cilpu.

Saglabājiet izmaiņas, izejiet no teksta redaktora un palaidiet skriptu. Tas izveidosies piecas reizes (ar i palielinot no 0 uz 4 , vienu reizi cilpā). Katra cilpa vienu reizi novirzīs vērtības un atbalsīs vērtības 0 - 4 līdz terminālim.

./myargs.sh one two three four five
Shifted 0 time(s): ------------------ 1: one 2: two 3: three 4: four Shifted 1 time(s): ------------------ 1: two 2: three 3: four 4: five Shifted 2 time(s): ------------------ 1: three 2: four 3: five 4: Shifted 3 time(s): ------------------ 1: four 2: five 3: 4: Shifted 4 time(s): ------------------ 1: five 2: 3: 4:

Tagad, kad mēs esam redzējuši, kā parametri tiek pārvietoti, izveidosim skriptu ar praktisku mērķi.

Reālās pasaules piemērs

Šis skripts, clean-old-files.sh , pieņem sarakstu ar direktorijā nosaukumi kā parametri komandrindā. Katrā nosauktajā direktorijā tiek meklēti faili, kuriem nav piekļūts vairāk nekā gadu, un tie tiek izdzēsti.

#!/bin/bash # Scan directories for old files (over 365 days) and delete them. USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then # If zero arguments were supplied, echo 'Error: no directory names provided.' echo '$USAGE' # display a help message exit 1 # and return an error. fi while (( '$#' )); do # While there are arguments still to be shifted while IFS= read -r -d $'' file; do echo 'Removing $file...' rm $file done <<(find '$1' -type f -atime +365 -print0) shift done echo 'Done.' exit 0

Apskatīsim atsevišķas šī skripta daļas un analizēsim to darbību:

USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then echo 'Error: no directory names provided.' echo '$USAGE' exit 1 fi

Šajā ja nosacīts paziņojums , skripts pārbauda, ​​vai ir kādi argumenti. Pārbaudē tiek izmantots vienas iekavas apzīmējums ( [ & hellip; ] ), kas ir līdzvērtīgs iebūvētās komandas izmantošanai pārbaude . Īpašais čaulas mainīgais $ # tur kopējo pozīcijas parametru skaitu. Ja tā vērtība ir vienāda ar nulli, tas nozīmē, ka lietotājs nav norādījis direktoriju nosaukumus, tāpēc mēs atbalsojam palīdzības ziņojumu un skriptu pārtraucam ar kļūdu (izejas statuss 1 ).

while (( '$#' )); do

Pretējā gadījumā mēs ejam uz ārējo kamēr cilpa, kas izmanto dubultās iekavas novērtēšanu, lai redzētu, vai $ # ir taisnība - tas ir, ja tā vērtība ir kas cits kā nulle. Katru reizi, kad sākas cilpa, ja $ # ir nulle, izteiksme tiek vērtēta kā nepatiesa, un cilpa iziet.

Padoms

Izteiksmes (('$ #')) un ['$ #'! = '0'] dod līdzvērtīgus rezultātus un ir funkcionāli savstarpēji aizstājami.

Tālāk apskatīsim abas iekšējās cilpu puses:

 while IFS= read -r -d $'' file; do

Šajā rindā teikts: kamēr ir lasīt vienumi, kas ir norobežots ( -d ) ar nulles rakstzīmi ( $ ' 0' ), lasiet mainīgajā vienu vienumu failu , pēc tam izpildiet komandas cilpa iekšpusē.

Vienumus nodrošina rinda cilpas beigās:

 done <<(find '$1' -type f -atime +365 -print0)

Šajā rindā teikts: atrast visi faili, sākot meklēšanu direktorijā dir1 (pozicionālajā parametrā 1 USD ), kuriem pēdējo reizi piekļuva ( -laiks ) vairāk par ( + ) 365 dienas atpakaļ. Norobežojiet atbilstošo failu nosaukumu sarakstu ar nulles rakstzīmēm ( -druka0 ).

The atrast komanda ir pievienota <( & hellip; ) , kas izmanto procesa aizstāšana apstrādāt izvadi tā, it kā tas būtu fails. Šī faila saturs tiek novirzīts ( < ) uz iekšējo, kamēr cilpu. Tur, lasīt visu līdz nulles rakstzīmei interpretē kā nākamo faila nosaukumu un piešķir šim nosaukumam mainīgo failu . Pēc tam tiek izpildīta cilpas iekšpuse:

 echo 'Removing $file...' rm $file

Kurš izdrukā faila nosaukumu un noņem fails.

Iekšējā cilpa turpinās, līdz vairs nav failu nosaukumu, tātad lasīt atgriež false. Iekšējā cilpa iziet uz ārējo cilpu, kur mēs ...

 shift

maiņa pozicionēšanas parametrus tā, lai dir2 ( 2 USD ) ir tagad dir1 ( 1 USD ). Vecais 1 USD tiek izmests un $ # tiek automātiski samazināts par 1.

done

Atgriezieties ārējā sākumā kamēr cilpa. Ja pozīcijas parametru vairs nav, pārbaudiet (('$ #')) atgriež false, ārējā cilpa iziet un ...

echo 'Done.' exit 0

Mēs izejam ar panākumiem (izejas statuss 0 ).

Skripta palaišana izskatās šādi:

./clean-old-files.sh mydir1 mydir2
Removing mydir1/subdir1/Netscape-Navigator-1.0.zip... Removing mydir1/subdir2/my-soon-to-be-finished-novel.rtf... Removing mydir2/subdir1/grunge-the-new-phenomenon.doc... Removing mydir2/subdir2/my-geocities-page.htm... Removing mydir2/subdir3/half-life-2-leaked-beta.rar... Done.

getopts - Parsēšanas argumenti, kas nodoti čaulas skriptam.


echo 1: echo 2: echo 3: echo 4:

Pirmā rinda, kas sākas ar #! (a 'shebang') nosaka, kura čaulas programma jāizmanto, lai palaistu skriptu.

Otrā rinda (' maiņa 0 ') neko nedara - pagaidām. Pēc šāda skripta palaišanas mēs mainīsimies 0 uz citu numuru.

Tagad saglabājiet to failā ar nosaukumu myargs.sh un izejiet no teksta redaktora.

Veidot myargs.sh izpildāms:

chmod u+x ./myargs.sh

Pēc tam palaidiet to un norādiet dažus argumentus:

./myargs.sh one two three four five
0: ./myargs.sh 1: one 2: two 3: three 4: four

Šajā izvadē mēs varam redzēt pozicionālo parametru vērtības 0 - 4 . (Vērtība 5 USD ir ' pieci , taču šo vērtību mēs savā skriptā neizmantojam.)

Kā es varu pagriezt manu ekrānu atpakaļ normālā stāvoklī

Šīs vērtības ir raksturīgas mūsu pašreizējai komandai - skriptam. Kad skripts ir pabeigts, šīs vērtības pirms skripta palaišanas atgriežas savās vērtībās. Tātad tagad komandu uzvednē varat palaist:

echo id="texttext">
					

Bash shift iebūvēta komanda

maiņas komanda

Ieslēgts Līdzīgi Unix operētājsistēmas, maiņa ir iebūvēta komanda Bash apvalks. Kad tas tiek izpildīts, tas pārvieto pozicionālie parametri (piemēram, argumenti, kas nodoti bash scenārijs ) pa kreisi, katru parametru novietojot zemākā pozīcijā.

Apraksts

Kad tu skrien maiņa , pašreizējie pozicionēšanas parametri ir nobīdīti pa kreisi n reizes. Pozicionālais parametrs x tiek piešķirta parametra vērtība x + n . Ja parametrs x + n neeksistē, parametrs x ir nenoteikts .



Ja nav norādīts, noklusējuma vērtība n ir 1 . Tātad komandas 1. maiņa ' un ' maiņa '(bez argumentiem) dara to pašu.

Ja parametrs tiek novirzīts uz pozīciju, kuras skaitlis ir mazāks par 1, tas “nokrīt” - tā vērtība tiek izmesta. Tātad komanda maiņa vienmēr izmet iepriekšējo vērtību 1 USD , un 2. maiņa vienmēr atmet iepriekšējās vērtības 1 USD un 2 USD .

Īpašais pozicionālais parametrs 0 USD nav izslēgts no visām maiņu operācijām un to nekad nemaina maiņa komandu.



Sintakse

  shift  [  n  ]

The maiņa komandai nepieciešams tikai viens arguments:

n Pozīciju skaits, kuru parametri jāpārvieto pa kreisi. Šī vērtība var būt jebkurš nenegatīvs vesels skaitlis. Ja n ir nulle ( 0 ), parametru maiņa netiks veikta. Noklusējuma vērtība n ir 1 .

Iziet no statusa

Kad maiņa iziet, tas atgriež izejas statusu 0 (nav kļūdas), ja vien: n ir negatīva, vai n ir lielāks par pašreizējo pozicionālo parametru skaitu, šajā gadījumā izejas statuss ir nulle.

Pozicionālie parametri bash

Bashā, kad komanda tiek izpildīta, šīs komandas vide ietver īpašus mainīgos, kas satur komandai piešķirtos individuālos parametrus.



Šo mainīgo nosaukums ir skaitlis, kas atbilst šī parametra pozīcijai komandrindā.

Piemēram, apsveriet šādu komandu:

mv file_old.txt file_new.txt

Šai komandai ir trīs pozīcijas parametri, kas numurēti šādi:

Parametrs Pozīcija Apraksts
mv 0 The mv komanda , kas pārvieto failus. Šajā gadījumā tas tiek pārdēvēts file_old.txt uz file_new.txt “pārvietojot” to uz jauno faila nosaukums .
file_old.txt 1 Sākotnējais faila nosaukums.
file_new.txt divi Jaunais faila nosaukums.

Pirmais parametrs, 0 , satur komandas nosaukumu. Ja argumentu nav, tas būs vienīgais pozīcijas parametrs.

Kad pēc komandas tiek iekļauti argumenti, katrs no tiem tiek saglabāts nosauktajos čaulas mainīgajos 1 , divi Tāpat kā uz visiem citiem čaulas mainīgajiem, uz to vērtību var atsaukties, pirms mainīgā nosaukuma ievietojot dolāra zīmi. Tātad pozicionālā parametra vērtība 1 var atsaukties ar 1 USD , parametra vērtība divi var atsaukties ar 2 USD utt.

Parametri ar skaitli 10 vai lielāku var atsaukties, ievietojot skaitli iekavās, piemēram {10} USD , {11} USD vai {12345} USD .

Bašs seko līdzi kopējam pozīcijas parametru skaitam. Šis numurs tiek saglabāts īpašajā čaulas mainīgajā $ # .

Vērtība $ # samazinās par n katru reizi, kad skrien maiņa .

Īpašs pozicionālais parametrs nulle

Pozicionālais parametrs nulle ( 0 ) satur komandas nosaukumu, kas tika izmantota pašreizējā procesa sākšanai, tiklīdz tā tika izpildīta. Pārbaudot šī mainīgā vērtību, vienmēr varat uzzināt, kāda komanda tika izmantota pašreizējā procesa uzsākšanai.

Piemēram: no bash uzvednes varat palaist atbalss $ 0 lai redzētu komandu, kas palaida jūsu pašreizējo bash sesiju:

echo $0
/bin/bash

Šī ir bash atrašanās vieta izpildāms .

Tomēr ir dažādi veidi, kā palaist izpildāmo failu - piemēram, daudzas programmas tiek izpildītas, izmantojot a simlink (simboliska saite). Ja palaižat komandu, izmantojot simbolu saiti, 0 USD satur jūsu izmantotās saites nosaukumu.

Piemēram, varat izveidot saiti uz bash jūsu mājas direktorijā:

ln -s /bin/bash ~/mybash

Un padariet symlink izpildāmu, izmantojot chmod :

chmod u+x ~/mybash

Pēc tam jūs varat sākt jaunu mazu bērnu procesu, izpildot simlink:

~/mybash

Jūs tagad esat jaunā bash apvalkā, iepriekšējā čaulā. Ja skrien atbalss $ 0 , jūs redzēsiet atšķirību:

echo $0
/home/hope/mybash

Šis ir pilnīgs ceļš uz jūsu mājas direktoriju, kas ir paplašināts ar bash, kad izmantojāt aizstājvārdu ~ (uz akcentu atzīme ). Jūs varat rakstīt Izeja tagad, lai atgrieztos pie sava sākotnējā bash apvalka.

Piemēri

Pārslēgšanas parametri

Izveidosim skriptu, kas pieņem argumentus. Mēs apskatīsim, kā un kā argumenti tiek saglabāti vidē kā pozīcijas parametri maiņa ietekmē viņus.

Izveidojiet jaunu skriptu ar iecienītāko teksta redaktoru, piemēram, virsotne vai vim. Skriptam vajadzētu izskatīties šādi:

#!/bin/bash shift 0 echo 0: $0 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 

Pirmā rinda, kas sākas ar #! (a 'shebang') nosaka, kura čaulas programma jāizmanto, lai palaistu skriptu.

Otrā rinda (' maiņa 0 ') neko nedara - pagaidām. Pēc šāda skripta palaišanas mēs mainīsimies 0 uz citu numuru.

Tagad saglabājiet to failā ar nosaukumu myargs.sh un izejiet no teksta redaktora.

Veidot myargs.sh izpildāms:

chmod u+x ./myargs.sh

Pēc tam palaidiet to un norādiet dažus argumentus:

./myargs.sh one two three four five
0: ./myargs.sh 1: one 2: two 3: three 4: four

Šajā izvadē mēs varam redzēt pozicionālo parametru vērtības 0 - 4 . (Vērtība 5 USD ir ' pieci , taču šo vērtību mēs savā skriptā neizmantojam.)

Šīs vērtības ir raksturīgas mūsu pašreizējai komandai - skriptam. Kad skripts ir pabeigts, šīs vērtības pirms skripta palaišanas atgriežas savās vērtībās. Tātad tagad komandu uzvednē varat palaist:

echo $0, $1, $2, $3, $4.
/bin/bash, , , , .

Šīs ir mūsu bash sesijas vērtības. 0 USD ir izpildāmā bash atrašanās vieta, un pārējiem parametriem nav vērtības.

Tagad mainīsimies maiņa 0 uz 1. maiņa . Atveriet skriptu teksta redaktorā un nomainiet otro rindiņu, lai skripts izskatās šādi:

$!/bin/bash shift # same as shift 1 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4

Viss aiz jaukšanas zīmes (' # ') 2. līnijā ir a komentēt , un tiek ignorēts, kad skripts darbojas.

Saglabājiet failu un izejiet no teksta redaktora. Pēc tam vēlreiz palaidiet skriptu:

./myargs.sh one two three four five
0: ./myargs.sh 1: two 2: three 3: four 4: five

Ievērojiet, ka visu parametru pozīcija ir nobīdīta uz leju par vienu. Sākotnējā vērtība 1 USD tika izmests, un vērtība 5 USD tagad ir plkst 4 USD . Vērtība 0 USD nav mainījusies.

Bet, skrienot maiņa tikai vienu reizi nav ļoti noderīgi. Parasti jūs vēlaties to palaist vairākas reizes, ciklā. Mēs varam pārrakstīt iepriekš minēto skriptu kā cilpu, kur katra iterācija vienreiz maina parametrus. Teksta redaktorā mainiet skriptu, lai tas izskatās šādi:

#!/bin/bash for (( i = 0; i <= 4; i++ )); do echo Shifted $i time(s): echo ----------------- echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 echo shift done

Ievērojiet to maiņa ir pēdējā komanda cilpā. Tas ļauj mums kaut ko darīt attiecībā uz parametriem, pirms tie tiek pārvietoti. Tad kā pēdējo soli mēs mainām parametrus un atkal palaižam cilpu.

Saglabājiet izmaiņas, izejiet no teksta redaktora un palaidiet skriptu. Tas izveidosies piecas reizes (ar i palielinot no 0 uz 4 , vienu reizi cilpā). Katra cilpa vienu reizi novirzīs vērtības un atbalsīs vērtības 0 - 4 līdz terminālim.

./myargs.sh one two three four five
Shifted 0 time(s): ------------------ 1: one 2: two 3: three 4: four Shifted 1 time(s): ------------------ 1: two 2: three 3: four 4: five Shifted 2 time(s): ------------------ 1: three 2: four 3: five 4: Shifted 3 time(s): ------------------ 1: four 2: five 3: 4: Shifted 4 time(s): ------------------ 1: five 2: 3: 4:

Tagad, kad mēs esam redzējuši, kā parametri tiek pārvietoti, izveidosim skriptu ar praktisku mērķi.

Reālās pasaules piemērs

Šis skripts, clean-old-files.sh , pieņem sarakstu ar direktorijā nosaukumi kā parametri komandrindā. Katrā nosauktajā direktorijā tiek meklēti faili, kuriem nav piekļūts vairāk nekā gadu, un tie tiek izdzēsti.

#!/bin/bash # Scan directories for old files (over 365 days) and delete them. USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then # If zero arguments were supplied, echo 'Error: no directory names provided.' echo '$USAGE' # display a help message exit 1 # and return an error. fi while (( '$#' )); do # While there are arguments still to be shifted while IFS= read -r -d $'' file; do echo 'Removing $file...' rm $file done <<(find '$1' -type f -atime +365 -print0) shift done echo 'Done.' exit 0

Apskatīsim atsevišķas šī skripta daļas un analizēsim to darbību:

USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then echo 'Error: no directory names provided.' echo '$USAGE' exit 1 fi

Šajā ja nosacīts paziņojums , skripts pārbauda, ​​vai ir kādi argumenti. Pārbaudē tiek izmantots vienas iekavas apzīmējums ( [ & hellip; ] ), kas ir līdzvērtīgs iebūvētās komandas izmantošanai pārbaude . Īpašais čaulas mainīgais $ # tur kopējo pozīcijas parametru skaitu. Ja tā vērtība ir vienāda ar nulli, tas nozīmē, ka lietotājs nav norādījis direktoriju nosaukumus, tāpēc mēs atbalsojam palīdzības ziņojumu un skriptu pārtraucam ar kļūdu (izejas statuss 1 ).

while (( '$#' )); do

Pretējā gadījumā mēs ejam uz ārējo kamēr cilpa, kas izmanto dubultās iekavas novērtēšanu, lai redzētu, vai $ # ir taisnība - tas ir, ja tā vērtība ir kas cits kā nulle. Katru reizi, kad sākas cilpa, ja $ # ir nulle, izteiksme tiek vērtēta kā nepatiesa, un cilpa iziet.

Padoms

Izteiksmes (('$ #')) un ['$ #'! = '0'] dod līdzvērtīgus rezultātus un ir funkcionāli savstarpēji aizstājami.

Tālāk apskatīsim abas iekšējās cilpu puses:

 while IFS= read -r -d $'' file; do

Šajā rindā teikts: kamēr ir lasīt vienumi, kas ir norobežots ( -d ) ar nulles rakstzīmi ( $ ' 0' ), lasiet mainīgajā vienu vienumu failu , pēc tam izpildiet komandas cilpa iekšpusē.

Vienumus nodrošina rinda cilpas beigās:

 done <<(find '$1' -type f -atime +365 -print0)

Šajā rindā teikts: atrast visi faili, sākot meklēšanu direktorijā dir1 (pozicionālajā parametrā 1 USD ), kuriem pēdējo reizi piekļuva ( -laiks ) vairāk par ( + ) 365 dienas atpakaļ. Norobežojiet atbilstošo failu nosaukumu sarakstu ar nulles rakstzīmēm ( -druka0 ).

The atrast komanda ir pievienota <( & hellip; ) , kas izmanto procesa aizstāšana apstrādāt izvadi tā, it kā tas būtu fails. Šī faila saturs tiek novirzīts ( < ) uz iekšējo, kamēr cilpu. Tur, lasīt visu līdz nulles rakstzīmei interpretē kā nākamo faila nosaukumu un piešķir šim nosaukumam mainīgo failu . Pēc tam tiek izpildīta cilpas iekšpuse:

 echo 'Removing $file...' rm $file

Kurš izdrukā faila nosaukumu un noņem fails.

Iekšējā cilpa turpinās, līdz vairs nav failu nosaukumu, tātad lasīt atgriež false. Iekšējā cilpa iziet uz ārējo cilpu, kur mēs ...

 shift

maiņa pozicionēšanas parametrus tā, lai dir2 ( 2 USD ) ir tagad dir1 ( 1 USD ). Vecais 1 USD tiek izmests un $ # tiek automātiski samazināts par 1.

done

Atgriezieties ārējā sākumā kamēr cilpa. Ja pozīcijas parametru vairs nav, pārbaudiet (('$ #')) atgriež false, ārējā cilpa iziet un ...

echo 'Done.' exit 0

Mēs izejam ar panākumiem (izejas statuss 0 ).

Skripta palaišana izskatās šādi:

./clean-old-files.sh mydir1 mydir2
Removing mydir1/subdir1/Netscape-Navigator-1.0.zip... Removing mydir1/subdir2/my-soon-to-be-finished-novel.rtf... Removing mydir2/subdir1/grunge-the-new-phenomenon.doc... Removing mydir2/subdir2/my-geocities-page.htm... Removing mydir2/subdir3/half-life-2-leaked-beta.rar... Done.

getopts - Parsēšanas argumenti, kas nodoti čaulas skriptam.


, , , , .
/bin/bash, , , , .

Šīs ir mūsu bash sesijas vērtības. 0 USD ir izpildāmā bash atrašanās vieta, un pārējiem parametriem nav vērtības.

Tagad mainīsimies maiņa 0 uz 1. maiņa . Atveriet skriptu teksta redaktorā un nomainiet otro rindiņu, lai skripts izskatās šādi:

$!/bin/bash shift # same as shift 1 echo 1:  echo 2:  echo 3:  echo 4: 

Viss aiz jaukšanas zīmes (' # ') 2. līnijā ir a komentēt , un tiek ignorēts, kad skripts darbojas.

Saglabājiet failu un izejiet no teksta redaktora. Pēc tam vēlreiz palaidiet skriptu:

./myargs.sh one two three four five
0: ./myargs.sh 1: two 2: three 3: four 4: five

Ievērojiet, ka visu parametru pozīcija ir nobīdīta uz leju par vienu. Sākotnējā vērtība 1 USD tika izmests, un vērtība 5 USD tagad ir plkst 4 USD . Vērtība 0 USD nav mainījusies.

Bet, skrienot maiņa tikai vienu reizi nav ļoti noderīgi. Parasti jūs vēlaties to palaist vairākas reizes, ciklā. Mēs varam pārrakstīt iepriekš minēto skriptu kā cilpu, kur katra iterācija vienreiz maina parametrus. Teksta redaktorā mainiet skriptu, lai tas izskatās šādi:

#!/bin/bash for (( i = 0; i <= 4; i++ )); do echo Shifted $i time(s): echo ----------------- echo 1:  echo 2:  echo 3:  echo 4:  echo shift done

Ievērojiet to maiņa ir pēdējā komanda cilpā. Tas ļauj mums kaut ko darīt attiecībā uz parametriem, pirms tie tiek pārvietoti. Tad kā pēdējo soli mēs mainām parametrus un atkal palaižam cilpu.

Saglabājiet izmaiņas, izejiet no teksta redaktora un palaidiet skriptu. Tas izveidosies piecas reizes (ar i palielinot no 0 uz 4 , vienu reizi cilpā). Katra cilpa vienu reizi novirzīs vērtības un atbalsīs vērtības 0 - 4 līdz terminālim.

./myargs.sh one two three four five
Shifted 0 time(s): ------------------ 1: one 2: two 3: three 4: four Shifted 1 time(s): ------------------ 1: two 2: three 3: four 4: five Shifted 2 time(s): ------------------ 1: three 2: four 3: five 4: Shifted 3 time(s): ------------------ 1: four 2: five 3: 4: Shifted 4 time(s): ------------------ 1: five 2: 3: 4:

Tagad, kad mēs esam redzējuši, kā parametri tiek pārvietoti, izveidosim skriptu ar praktisku mērķi.

Reālās pasaules piemērs

Šis skripts, clean-old-files.sh , pieņem sarakstu ar direktorijā nosaukumi kā parametri komandrindā. Katrā nosauktajā direktorijā tiek meklēti faili, kuriem nav piekļūts vairāk nekā gadu, un tie tiek izdzēsti.

#!/bin/bash # Scan directories for old files (over 365 days) and delete them. USAGE='Usage: id="texttext">
					

Bash shift iebūvēta komanda

maiņas komanda

Ieslēgts Līdzīgi Unix operētājsistēmas, maiņa ir iebūvēta komanda Bash apvalks. Kad tas tiek izpildīts, tas pārvieto pozicionālie parametri (piemēram, argumenti, kas nodoti bash scenārijs ) pa kreisi, katru parametru novietojot zemākā pozīcijā.

Apraksts

Kad tu skrien maiņa , pašreizējie pozicionēšanas parametri ir nobīdīti pa kreisi n reizes. Pozicionālais parametrs x tiek piešķirta parametra vērtība x + n . Ja parametrs x + n neeksistē, parametrs x ir nenoteikts .



Ja nav norādīts, noklusējuma vērtība n ir 1 . Tātad komandas 1. maiņa ' un ' maiņa '(bez argumentiem) dara to pašu.

Ja parametrs tiek novirzīts uz pozīciju, kuras skaitlis ir mazāks par 1, tas “nokrīt” - tā vērtība tiek izmesta. Tātad komanda maiņa vienmēr izmet iepriekšējo vērtību 1 USD , un 2. maiņa vienmēr atmet iepriekšējās vērtības 1 USD un 2 USD .

Īpašais pozicionālais parametrs 0 USD nav izslēgts no visām maiņu operācijām un to nekad nemaina maiņa komandu.



Sintakse

  shift  [  n  ]

The maiņa komandai nepieciešams tikai viens arguments:

n Pozīciju skaits, kuru parametri jāpārvieto pa kreisi. Šī vērtība var būt jebkurš nenegatīvs vesels skaitlis. Ja n ir nulle ( 0 ), parametru maiņa netiks veikta. Noklusējuma vērtība n ir 1 .

Iziet no statusa

Kad maiņa iziet, tas atgriež izejas statusu 0 (nav kļūdas), ja vien: n ir negatīva, vai n ir lielāks par pašreizējo pozicionālo parametru skaitu, šajā gadījumā izejas statuss ir nulle.

Pozicionālie parametri bash

Bashā, kad komanda tiek izpildīta, šīs komandas vide ietver īpašus mainīgos, kas satur komandai piešķirtos individuālos parametrus.



Šo mainīgo nosaukums ir skaitlis, kas atbilst šī parametra pozīcijai komandrindā.

Piemēram, apsveriet šādu komandu:

mv file_old.txt file_new.txt

Šai komandai ir trīs pozīcijas parametri, kas numurēti šādi:

Parametrs Pozīcija Apraksts
mv 0 The mv komanda , kas pārvieto failus. Šajā gadījumā tas tiek pārdēvēts file_old.txt uz file_new.txt “pārvietojot” to uz jauno faila nosaukums .
file_old.txt 1 Sākotnējais faila nosaukums.
file_new.txt divi Jaunais faila nosaukums.

Pirmais parametrs, 0 , satur komandas nosaukumu. Ja argumentu nav, tas būs vienīgais pozīcijas parametrs.

Kad pēc komandas tiek iekļauti argumenti, katrs no tiem tiek saglabāts nosauktajos čaulas mainīgajos 1 , divi Tāpat kā uz visiem citiem čaulas mainīgajiem, uz to vērtību var atsaukties, pirms mainīgā nosaukuma ievietojot dolāra zīmi. Tātad pozicionālā parametra vērtība 1 var atsaukties ar 1 USD , parametra vērtība divi var atsaukties ar 2 USD utt.

Parametri ar skaitli 10 vai lielāku var atsaukties, ievietojot skaitli iekavās, piemēram {10} USD , {11} USD vai {12345} USD .

Bašs seko līdzi kopējam pozīcijas parametru skaitam. Šis numurs tiek saglabāts īpašajā čaulas mainīgajā $ # .

Vērtība $ # samazinās par n katru reizi, kad skrien maiņa .

Īpašs pozicionālais parametrs nulle

Pozicionālais parametrs nulle ( 0 ) satur komandas nosaukumu, kas tika izmantota pašreizējā procesa sākšanai, tiklīdz tā tika izpildīta. Pārbaudot šī mainīgā vērtību, vienmēr varat uzzināt, kāda komanda tika izmantota pašreizējā procesa uzsākšanai.

Piemēram: no bash uzvednes varat palaist atbalss $ 0 lai redzētu komandu, kas palaida jūsu pašreizējo bash sesiju:

echo $0
/bin/bash

Šī ir bash atrašanās vieta izpildāms .

Tomēr ir dažādi veidi, kā palaist izpildāmo failu - piemēram, daudzas programmas tiek izpildītas, izmantojot a simlink (simboliska saite). Ja palaižat komandu, izmantojot simbolu saiti, 0 USD satur jūsu izmantotās saites nosaukumu.

Piemēram, varat izveidot saiti uz bash jūsu mājas direktorijā:

ln -s /bin/bash ~/mybash

Un padariet symlink izpildāmu, izmantojot chmod :

chmod u+x ~/mybash

Pēc tam jūs varat sākt jaunu mazu bērnu procesu, izpildot simlink:

~/mybash

Jūs tagad esat jaunā bash apvalkā, iepriekšējā čaulā. Ja skrien atbalss $ 0 , jūs redzēsiet atšķirību:

echo $0
/home/hope/mybash

Šis ir pilnīgs ceļš uz jūsu mājas direktoriju, kas ir paplašināts ar bash, kad izmantojāt aizstājvārdu ~ (uz akcentu atzīme ). Jūs varat rakstīt Izeja tagad, lai atgrieztos pie sava sākotnējā bash apvalka.

Piemēri

Pārslēgšanas parametri

Izveidosim skriptu, kas pieņem argumentus. Mēs apskatīsim, kā un kā argumenti tiek saglabāti vidē kā pozīcijas parametri maiņa ietekmē viņus.

Izveidojiet jaunu skriptu ar iecienītāko teksta redaktoru, piemēram, virsotne vai vim. Skriptam vajadzētu izskatīties šādi:

#!/bin/bash shift 0 echo 0: $0 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 

Pirmā rinda, kas sākas ar #! (a 'shebang') nosaka, kura čaulas programma jāizmanto, lai palaistu skriptu.

Otrā rinda (' maiņa 0 ') neko nedara - pagaidām. Pēc šāda skripta palaišanas mēs mainīsimies 0 uz citu numuru.

Tagad saglabājiet to failā ar nosaukumu myargs.sh un izejiet no teksta redaktora.

Veidot myargs.sh izpildāms:

chmod u+x ./myargs.sh

Pēc tam palaidiet to un norādiet dažus argumentus:

./myargs.sh one two three four five
0: ./myargs.sh 1: one 2: two 3: three 4: four

Šajā izvadē mēs varam redzēt pozicionālo parametru vērtības 0 - 4 . (Vērtība 5 USD ir ' pieci , taču šo vērtību mēs savā skriptā neizmantojam.)

Šīs vērtības ir raksturīgas mūsu pašreizējai komandai - skriptam. Kad skripts ir pabeigts, šīs vērtības pirms skripta palaišanas atgriežas savās vērtībās. Tātad tagad komandu uzvednē varat palaist:

echo $0, $1, $2, $3, $4.
/bin/bash, , , , .

Šīs ir mūsu bash sesijas vērtības. 0 USD ir izpildāmā bash atrašanās vieta, un pārējiem parametriem nav vērtības.

Tagad mainīsimies maiņa 0 uz 1. maiņa . Atveriet skriptu teksta redaktorā un nomainiet otro rindiņu, lai skripts izskatās šādi:

$!/bin/bash shift # same as shift 1 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4

Viss aiz jaukšanas zīmes (' # ') 2. līnijā ir a komentēt , un tiek ignorēts, kad skripts darbojas.

Saglabājiet failu un izejiet no teksta redaktora. Pēc tam vēlreiz palaidiet skriptu:

./myargs.sh one two three four five
0: ./myargs.sh 1: two 2: three 3: four 4: five

Ievērojiet, ka visu parametru pozīcija ir nobīdīta uz leju par vienu. Sākotnējā vērtība 1 USD tika izmests, un vērtība 5 USD tagad ir plkst 4 USD . Vērtība 0 USD nav mainījusies.

Bet, skrienot maiņa tikai vienu reizi nav ļoti noderīgi. Parasti jūs vēlaties to palaist vairākas reizes, ciklā. Mēs varam pārrakstīt iepriekš minēto skriptu kā cilpu, kur katra iterācija vienreiz maina parametrus. Teksta redaktorā mainiet skriptu, lai tas izskatās šādi:

#!/bin/bash for (( i = 0; i <= 4; i++ )); do echo Shifted $i time(s): echo ----------------- echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 echo shift done

Ievērojiet to maiņa ir pēdējā komanda cilpā. Tas ļauj mums kaut ko darīt attiecībā uz parametriem, pirms tie tiek pārvietoti. Tad kā pēdējo soli mēs mainām parametrus un atkal palaižam cilpu.

Saglabājiet izmaiņas, izejiet no teksta redaktora un palaidiet skriptu. Tas izveidosies piecas reizes (ar i palielinot no 0 uz 4 , vienu reizi cilpā). Katra cilpa vienu reizi novirzīs vērtības un atbalsīs vērtības 0 - 4 līdz terminālim.

./myargs.sh one two three four five
Shifted 0 time(s): ------------------ 1: one 2: two 3: three 4: four Shifted 1 time(s): ------------------ 1: two 2: three 3: four 4: five Shifted 2 time(s): ------------------ 1: three 2: four 3: five 4: Shifted 3 time(s): ------------------ 1: four 2: five 3: 4: Shifted 4 time(s): ------------------ 1: five 2: 3: 4:

Tagad, kad mēs esam redzējuši, kā parametri tiek pārvietoti, izveidosim skriptu ar praktisku mērķi.

Reālās pasaules piemērs

Šis skripts, clean-old-files.sh , pieņem sarakstu ar direktorijā nosaukumi kā parametri komandrindā. Katrā nosauktajā direktorijā tiek meklēti faili, kuriem nav piekļūts vairāk nekā gadu, un tie tiek izdzēsti.

#!/bin/bash # Scan directories for old files (over 365 days) and delete them. USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then # If zero arguments were supplied, echo 'Error: no directory names provided.' echo '$USAGE' # display a help message exit 1 # and return an error. fi while (( '$#' )); do # While there are arguments still to be shifted while IFS= read -r -d $'' file; do echo 'Removing $file...' rm $file done <<(find '$1' -type f -atime +365 -print0) shift done echo 'Done.' exit 0

Apskatīsim atsevišķas šī skripta daļas un analizēsim to darbību:

USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then echo 'Error: no directory names provided.' echo '$USAGE' exit 1 fi

Šajā ja nosacīts paziņojums , skripts pārbauda, ​​vai ir kādi argumenti. Pārbaudē tiek izmantots vienas iekavas apzīmējums ( [ & hellip; ] ), kas ir līdzvērtīgs iebūvētās komandas izmantošanai pārbaude . Īpašais čaulas mainīgais $ # tur kopējo pozīcijas parametru skaitu. Ja tā vērtība ir vienāda ar nulli, tas nozīmē, ka lietotājs nav norādījis direktoriju nosaukumus, tāpēc mēs atbalsojam palīdzības ziņojumu un skriptu pārtraucam ar kļūdu (izejas statuss 1 ).

while (( '$#' )); do

Pretējā gadījumā mēs ejam uz ārējo kamēr cilpa, kas izmanto dubultās iekavas novērtēšanu, lai redzētu, vai $ # ir taisnība - tas ir, ja tā vērtība ir kas cits kā nulle. Katru reizi, kad sākas cilpa, ja $ # ir nulle, izteiksme tiek vērtēta kā nepatiesa, un cilpa iziet.

Padoms

Izteiksmes (('$ #')) un ['$ #'! = '0'] dod līdzvērtīgus rezultātus un ir funkcionāli savstarpēji aizstājami.

Tālāk apskatīsim abas iekšējās cilpu puses:

 while IFS= read -r -d $'' file; do

Šajā rindā teikts: kamēr ir lasīt vienumi, kas ir norobežots ( -d ) ar nulles rakstzīmi ( $ ' 0' ), lasiet mainīgajā vienu vienumu failu , pēc tam izpildiet komandas cilpa iekšpusē.

Vienumus nodrošina rinda cilpas beigās:

 done <<(find '$1' -type f -atime +365 -print0)

Šajā rindā teikts: atrast visi faili, sākot meklēšanu direktorijā dir1 (pozicionālajā parametrā 1 USD ), kuriem pēdējo reizi piekļuva ( -laiks ) vairāk par ( + ) 365 dienas atpakaļ. Norobežojiet atbilstošo failu nosaukumu sarakstu ar nulles rakstzīmēm ( -druka0 ).

The atrast komanda ir pievienota <( & hellip; ) , kas izmanto procesa aizstāšana apstrādāt izvadi tā, it kā tas būtu fails. Šī faila saturs tiek novirzīts ( < ) uz iekšējo, kamēr cilpu. Tur, lasīt visu līdz nulles rakstzīmei interpretē kā nākamo faila nosaukumu un piešķir šim nosaukumam mainīgo failu . Pēc tam tiek izpildīta cilpas iekšpuse:

 echo 'Removing $file...' rm $file

Kurš izdrukā faila nosaukumu un noņem fails.

Iekšējā cilpa turpinās, līdz vairs nav failu nosaukumu, tātad lasīt atgriež false. Iekšējā cilpa iziet uz ārējo cilpu, kur mēs ...

 shift

maiņa pozicionēšanas parametrus tā, lai dir2 ( 2 USD ) ir tagad dir1 ( 1 USD ). Vecais 1 USD tiek izmests un $ # tiek automātiski samazināts par 1.

done

Atgriezieties ārējā sākumā kamēr cilpa. Ja pozīcijas parametru vairs nav, pārbaudiet (('$ #')) atgriež false, ārējā cilpa iziet un ...

echo 'Done.' exit 0

Mēs izejam ar panākumiem (izejas statuss 0 ).

Skripta palaišana izskatās šādi:

./clean-old-files.sh mydir1 mydir2
Removing mydir1/subdir1/Netscape-Navigator-1.0.zip... Removing mydir1/subdir2/my-soon-to-be-finished-novel.rtf... Removing mydir2/subdir1/grunge-the-new-phenomenon.doc... Removing mydir2/subdir2/my-geocities-page.htm... Removing mydir2/subdir3/half-life-2-leaked-beta.rar... Done.

getopts - Parsēšanas argumenti, kas nodoti čaulas skriptam.


dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then # If zero arguments were supplied, echo 'Error: no directory names provided.' echo '$USAGE' # display a help message exit 1 # and return an error. fi while (( '$#' )); do # While there are arguments still to be shifted while IFS= read -r -d $'' file; do echo 'Removing $file...' rm $file done <<(find '' -type f -atime +365 -print0) shift done echo 'Done.' exit 0

Apskatīsim atsevišķas šī skripta daļas un analizēsim to darbību:

USAGE='Usage: id="texttext">
					

Bash shift iebūvēta komanda

maiņas komanda

Ieslēgts Līdzīgi Unix operētājsistēmas, maiņa ir iebūvēta komanda Bash apvalks. Kad tas tiek izpildīts, tas pārvieto pozicionālie parametri (piemēram, argumenti, kas nodoti bash scenārijs ) pa kreisi, katru parametru novietojot zemākā pozīcijā.

Apraksts

Kad tu skrien maiņa , pašreizējie pozicionēšanas parametri ir nobīdīti pa kreisi n reizes. Pozicionālais parametrs x tiek piešķirta parametra vērtība x + n . Ja parametrs x + n neeksistē, parametrs x ir nenoteikts .



Ja nav norādīts, noklusējuma vērtība n ir 1 . Tātad komandas 1. maiņa ' un ' maiņa '(bez argumentiem) dara to pašu.

Ja parametrs tiek novirzīts uz pozīciju, kuras skaitlis ir mazāks par 1, tas “nokrīt” - tā vērtība tiek izmesta. Tātad komanda maiņa vienmēr izmet iepriekšējo vērtību 1 USD , un 2. maiņa vienmēr atmet iepriekšējās vērtības 1 USD un 2 USD .

Īpašais pozicionālais parametrs 0 USD nav izslēgts no visām maiņu operācijām un to nekad nemaina maiņa komandu.



Sintakse

  shift  [  n  ]

The maiņa komandai nepieciešams tikai viens arguments:

n Pozīciju skaits, kuru parametri jāpārvieto pa kreisi. Šī vērtība var būt jebkurš nenegatīvs vesels skaitlis. Ja n ir nulle ( 0 ), parametru maiņa netiks veikta. Noklusējuma vērtība n ir 1 .

Iziet no statusa

Kad maiņa iziet, tas atgriež izejas statusu 0 (nav kļūdas), ja vien: n ir negatīva, vai n ir lielāks par pašreizējo pozicionālo parametru skaitu, šajā gadījumā izejas statuss ir nulle.

Pozicionālie parametri bash

Bashā, kad komanda tiek izpildīta, šīs komandas vide ietver īpašus mainīgos, kas satur komandai piešķirtos individuālos parametrus.



Šo mainīgo nosaukums ir skaitlis, kas atbilst šī parametra pozīcijai komandrindā.

Piemēram, apsveriet šādu komandu:

mv file_old.txt file_new.txt

Šai komandai ir trīs pozīcijas parametri, kas numurēti šādi:

Parametrs Pozīcija Apraksts
mv 0 The mv komanda , kas pārvieto failus. Šajā gadījumā tas tiek pārdēvēts file_old.txt uz file_new.txt “pārvietojot” to uz jauno faila nosaukums .
file_old.txt 1 Sākotnējais faila nosaukums.
file_new.txt divi Jaunais faila nosaukums.

Pirmais parametrs, 0 , satur komandas nosaukumu. Ja argumentu nav, tas būs vienīgais pozīcijas parametrs.

Kad pēc komandas tiek iekļauti argumenti, katrs no tiem tiek saglabāts nosauktajos čaulas mainīgajos 1 , divi Tāpat kā uz visiem citiem čaulas mainīgajiem, uz to vērtību var atsaukties, pirms mainīgā nosaukuma ievietojot dolāra zīmi. Tātad pozicionālā parametra vērtība 1 var atsaukties ar 1 USD , parametra vērtība divi var atsaukties ar 2 USD utt.

Parametri ar skaitli 10 vai lielāku var atsaukties, ievietojot skaitli iekavās, piemēram {10} USD , {11} USD vai {12345} USD .

Bašs seko līdzi kopējam pozīcijas parametru skaitam. Šis numurs tiek saglabāts īpašajā čaulas mainīgajā $ # .

Vērtība $ # samazinās par n katru reizi, kad skrien maiņa .

Īpašs pozicionālais parametrs nulle

Pozicionālais parametrs nulle ( 0 ) satur komandas nosaukumu, kas tika izmantota pašreizējā procesa sākšanai, tiklīdz tā tika izpildīta. Pārbaudot šī mainīgā vērtību, vienmēr varat uzzināt, kāda komanda tika izmantota pašreizējā procesa uzsākšanai.

Piemēram: no bash uzvednes varat palaist atbalss $ 0 lai redzētu komandu, kas palaida jūsu pašreizējo bash sesiju:

echo $0
/bin/bash

Šī ir bash atrašanās vieta izpildāms .

Tomēr ir dažādi veidi, kā palaist izpildāmo failu - piemēram, daudzas programmas tiek izpildītas, izmantojot a simlink (simboliska saite). Ja palaižat komandu, izmantojot simbolu saiti, 0 USD satur jūsu izmantotās saites nosaukumu.

Piemēram, varat izveidot saiti uz bash jūsu mājas direktorijā:

ln -s /bin/bash ~/mybash

Un padariet symlink izpildāmu, izmantojot chmod :

chmod u+x ~/mybash

Pēc tam jūs varat sākt jaunu mazu bērnu procesu, izpildot simlink:

~/mybash

Jūs tagad esat jaunā bash apvalkā, iepriekšējā čaulā. Ja skrien atbalss $ 0 , jūs redzēsiet atšķirību:

echo $0
/home/hope/mybash

Šis ir pilnīgs ceļš uz jūsu mājas direktoriju, kas ir paplašināts ar bash, kad izmantojāt aizstājvārdu ~ (uz akcentu atzīme ). Jūs varat rakstīt Izeja tagad, lai atgrieztos pie sava sākotnējā bash apvalka.

Piemēri

Pārslēgšanas parametri

Izveidosim skriptu, kas pieņem argumentus. Mēs apskatīsim, kā un kā argumenti tiek saglabāti vidē kā pozīcijas parametri maiņa ietekmē viņus.

Izveidojiet jaunu skriptu ar iecienītāko teksta redaktoru, piemēram, virsotne vai vim. Skriptam vajadzētu izskatīties šādi:

#!/bin/bash shift 0 echo 0: $0 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 

Pirmā rinda, kas sākas ar #! (a 'shebang') nosaka, kura čaulas programma jāizmanto, lai palaistu skriptu.

Otrā rinda (' maiņa 0 ') neko nedara - pagaidām. Pēc šāda skripta palaišanas mēs mainīsimies 0 uz citu numuru.

Tagad saglabājiet to failā ar nosaukumu myargs.sh un izejiet no teksta redaktora.

Veidot myargs.sh izpildāms:

chmod u+x ./myargs.sh

Pēc tam palaidiet to un norādiet dažus argumentus:

./myargs.sh one two three four five
0: ./myargs.sh 1: one 2: two 3: three 4: four

Šajā izvadē mēs varam redzēt pozicionālo parametru vērtības 0 - 4 . (Vērtība 5 USD ir ' pieci , taču šo vērtību mēs savā skriptā neizmantojam.)

Šīs vērtības ir raksturīgas mūsu pašreizējai komandai - skriptam. Kad skripts ir pabeigts, šīs vērtības pirms skripta palaišanas atgriežas savās vērtībās. Tātad tagad komandu uzvednē varat palaist:

echo $0, $1, $2, $3, $4.
/bin/bash, , , , .

Šīs ir mūsu bash sesijas vērtības. 0 USD ir izpildāmā bash atrašanās vieta, un pārējiem parametriem nav vērtības.

Tagad mainīsimies maiņa 0 uz 1. maiņa . Atveriet skriptu teksta redaktorā un nomainiet otro rindiņu, lai skripts izskatās šādi:

$!/bin/bash shift # same as shift 1 echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4

Viss aiz jaukšanas zīmes (' # ') 2. līnijā ir a komentēt , un tiek ignorēts, kad skripts darbojas.

Saglabājiet failu un izejiet no teksta redaktora. Pēc tam vēlreiz palaidiet skriptu:

./myargs.sh one two three four five
0: ./myargs.sh 1: two 2: three 3: four 4: five

Ievērojiet, ka visu parametru pozīcija ir nobīdīta uz leju par vienu. Sākotnējā vērtība 1 USD tika izmests, un vērtība 5 USD tagad ir plkst 4 USD . Vērtība 0 USD nav mainījusies.

Bet, skrienot maiņa tikai vienu reizi nav ļoti noderīgi. Parasti jūs vēlaties to palaist vairākas reizes, ciklā. Mēs varam pārrakstīt iepriekš minēto skriptu kā cilpu, kur katra iterācija vienreiz maina parametrus. Teksta redaktorā mainiet skriptu, lai tas izskatās šādi:

#!/bin/bash for (( i = 0; i <= 4; i++ )); do echo Shifted $i time(s): echo ----------------- echo 1: $1 echo 2: $2 echo 3: $3 echo 4: $4 echo shift done

Ievērojiet to maiņa ir pēdējā komanda cilpā. Tas ļauj mums kaut ko darīt attiecībā uz parametriem, pirms tie tiek pārvietoti. Tad kā pēdējo soli mēs mainām parametrus un atkal palaižam cilpu.

Saglabājiet izmaiņas, izejiet no teksta redaktora un palaidiet skriptu. Tas izveidosies piecas reizes (ar i palielinot no 0 uz 4 , vienu reizi cilpā). Katra cilpa vienu reizi novirzīs vērtības un atbalsīs vērtības 0 - 4 līdz terminālim.

./myargs.sh one two three four five
Shifted 0 time(s): ------------------ 1: one 2: two 3: three 4: four Shifted 1 time(s): ------------------ 1: two 2: three 3: four 4: five Shifted 2 time(s): ------------------ 1: three 2: four 3: five 4: Shifted 3 time(s): ------------------ 1: four 2: five 3: 4: Shifted 4 time(s): ------------------ 1: five 2: 3: 4:

Tagad, kad mēs esam redzējuši, kā parametri tiek pārvietoti, izveidosim skriptu ar praktisku mērķi.

Reālās pasaules piemērs

Šis skripts, clean-old-files.sh , pieņem sarakstu ar direktorijā nosaukumi kā parametri komandrindā. Katrā nosauktajā direktorijā tiek meklēti faili, kuriem nav piekļūts vairāk nekā gadu, un tie tiek izdzēsti.

#!/bin/bash # Scan directories for old files (over 365 days) and delete them. USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then # If zero arguments were supplied, echo 'Error: no directory names provided.' echo '$USAGE' # display a help message exit 1 # and return an error. fi while (( '$#' )); do # While there are arguments still to be shifted while IFS= read -r -d $'' file; do echo 'Removing $file...' rm $file done <<(find '$1' -type f -atime +365 -print0) shift done echo 'Done.' exit 0

Apskatīsim atsevišķas šī skripta daļas un analizēsim to darbību:

USAGE='Usage: $0 dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then echo 'Error: no directory names provided.' echo '$USAGE' exit 1 fi

Šajā ja nosacīts paziņojums , skripts pārbauda, ​​vai ir kādi argumenti. Pārbaudē tiek izmantots vienas iekavas apzīmējums ( [ & hellip; ] ), kas ir līdzvērtīgs iebūvētās komandas izmantošanai pārbaude . Īpašais čaulas mainīgais $ # tur kopējo pozīcijas parametru skaitu. Ja tā vērtība ir vienāda ar nulli, tas nozīmē, ka lietotājs nav norādījis direktoriju nosaukumus, tāpēc mēs atbalsojam palīdzības ziņojumu un skriptu pārtraucam ar kļūdu (izejas statuss 1 ).

while (( '$#' )); do

Pretējā gadījumā mēs ejam uz ārējo kamēr cilpa, kas izmanto dubultās iekavas novērtēšanu, lai redzētu, vai $ # ir taisnība - tas ir, ja tā vērtība ir kas cits kā nulle. Katru reizi, kad sākas cilpa, ja $ # ir nulle, izteiksme tiek vērtēta kā nepatiesa, un cilpa iziet.

Padoms

Izteiksmes (('$ #')) un ['$ #'! = '0'] dod līdzvērtīgus rezultātus un ir funkcionāli savstarpēji aizstājami.

Tālāk apskatīsim abas iekšējās cilpu puses:

 while IFS= read -r -d $'' file; do

Šajā rindā teikts: kamēr ir lasīt vienumi, kas ir norobežots ( -d ) ar nulles rakstzīmi ( $ ' 0' ), lasiet mainīgajā vienu vienumu failu , pēc tam izpildiet komandas cilpa iekšpusē.

Vienumus nodrošina rinda cilpas beigās:

 done <<(find '$1' -type f -atime +365 -print0)

Šajā rindā teikts: atrast visi faili, sākot meklēšanu direktorijā dir1 (pozicionālajā parametrā 1 USD ), kuriem pēdējo reizi piekļuva ( -laiks ) vairāk par ( + ) 365 dienas atpakaļ. Norobežojiet atbilstošo failu nosaukumu sarakstu ar nulles rakstzīmēm ( -druka0 ).

The atrast komanda ir pievienota <( & hellip; ) , kas izmanto procesa aizstāšana apstrādāt izvadi tā, it kā tas būtu fails. Šī faila saturs tiek novirzīts ( < ) uz iekšējo, kamēr cilpu. Tur, lasīt visu līdz nulles rakstzīmei interpretē kā nākamo faila nosaukumu un piešķir šim nosaukumam mainīgo failu . Pēc tam tiek izpildīta cilpas iekšpuse:

 echo 'Removing $file...' rm $file

Kurš izdrukā faila nosaukumu un noņem fails.

Iekšējā cilpa turpinās, līdz vairs nav failu nosaukumu, tātad lasīt atgriež false. Iekšējā cilpa iziet uz ārējo cilpu, kur mēs ...

 shift

maiņa pozicionēšanas parametrus tā, lai dir2 ( 2 USD ) ir tagad dir1 ( 1 USD ). Vecais 1 USD tiek izmests un $ # tiek automātiski samazināts par 1.

done

Atgriezieties ārējā sākumā kamēr cilpa. Ja pozīcijas parametru vairs nav, pārbaudiet (('$ #')) atgriež false, ārējā cilpa iziet un ...

echo 'Done.' exit 0

Mēs izejam ar panākumiem (izejas statuss 0 ).

Skripta palaišana izskatās šādi:

./clean-old-files.sh mydir1 mydir2
Removing mydir1/subdir1/Netscape-Navigator-1.0.zip... Removing mydir1/subdir2/my-soon-to-be-finished-novel.rtf... Removing mydir2/subdir1/grunge-the-new-phenomenon.doc... Removing mydir2/subdir2/my-geocities-page.htm... Removing mydir2/subdir3/half-life-2-leaked-beta.rar... Done.

getopts - Parsēšanas argumenti, kas nodoti čaulas skriptam.


dir1 dir2 dir3 ...' if [ '$#' == '0' ]; then echo 'Error: no directory names provided.' echo '$USAGE' exit 1 fi

Šajā ja nosacīts paziņojums , skripts pārbauda, ​​vai ir kādi argumenti. Pārbaudē tiek izmantots vienas iekavas apzīmējums ( [ & hellip; ] ), kas ir līdzvērtīgs iebūvētās komandas izmantošanai pārbaude . Īpašais čaulas mainīgais $ # tur kopējo pozīcijas parametru skaitu. Ja tā vērtība ir vienāda ar nulli, tas nozīmē, ka lietotājs nav norādījis direktoriju nosaukumus, tāpēc mēs atbalsojam palīdzības ziņojumu un skriptu pārtraucam ar kļūdu (izejas statuss 1 ).

while (( '$#' )); do

Pretējā gadījumā mēs ejam uz ārējo kamēr cilpa, kas izmanto dubultās iekavas novērtēšanu, lai redzētu, vai $ # ir taisnība - tas ir, ja tā vērtība ir kas cits kā nulle. Katru reizi, kad sākas cilpa, ja $ # ir nulle, izteiksme tiek vērtēta kā nepatiesa, un cilpa iziet.

Padoms

Izteiksmes (('$ #')) un ['$ #'! = '0'] dod līdzvērtīgus rezultātus un ir funkcionāli savstarpēji aizstājami.

Tālāk apskatīsim abas iekšējās cilpu puses:

 while IFS= read -r -d $'' file; do

Šajā rindā teikts: kamēr ir lasīt vienumi, kas ir norobežots ( -d ) ar nulles rakstzīmi ( $ ' 0' ), lasiet mainīgajā vienu vienumu failu , pēc tam izpildiet komandas cilpa iekšpusē.

Vienumus nodrošina rinda cilpas beigās:

 done <<(find '' -type f -atime +365 -print0)

Šajā rindā teikts: atrast visi faili, sākot meklēšanu direktorijā dir1 (pozicionālajā parametrā 1 USD ), kuriem pēdējo reizi piekļuva ( -laiks ) vairāk par ( + ) 365 dienas atpakaļ. Norobežojiet atbilstošo failu nosaukumu sarakstu ar nulles rakstzīmēm ( -druka0 ).

The atrast komanda ir pievienota <( & hellip; ) , kas izmanto procesa aizstāšana apstrādāt izvadi tā, it kā tas būtu fails. Šī faila saturs tiek novirzīts ( < ) uz iekšējo, kamēr cilpu. Tur, lasīt visu līdz nulles rakstzīmei interpretē kā nākamo faila nosaukumu un piešķir šim nosaukumam mainīgo failu . Pēc tam tiek izpildīta cilpas iekšpuse:

 echo 'Removing $file...' rm $file

Kurš izdrukā faila nosaukumu un noņem fails.

Iekšējā cilpa turpinās, līdz vairs nav failu nosaukumu, tātad lasīt atgriež false. Iekšējā cilpa iziet uz ārējo cilpu, kur mēs ...

 shift

maiņa pozicionēšanas parametrus tā, lai dir2 ( 2 USD ) ir tagad dir1 ( 1 USD ). Vecais 1 USD tiek izmests un $ # tiek automātiski samazināts par 1.

done

Atgriezieties ārējā sākumā kamēr cilpa. Ja pozīcijas parametru vairs nav, pārbaudiet (('$ #')) atgriež false, ārējā cilpa iziet un ...

echo 'Done.' exit 0

Mēs izejam ar panākumiem (izejas statuss 0 ).

Skripta palaišana izskatās šādi:

./clean-old-files.sh mydir1 mydir2
Removing mydir1/subdir1/Netscape-Navigator-1.0.zip... Removing mydir1/subdir2/my-soon-to-be-finished-novel.rtf... Removing mydir2/subdir1/grunge-the-new-phenomenon.doc... Removing mydir2/subdir2/my-geocities-page.htm... Removing mydir2/subdir3/half-life-2-leaked-beta.rar... Done.

getopts - Parsēšanas argumenti, kas nodoti čaulas skriptam.