Norėdami išeiti iš bash kilpos. BASH: for, while, till ciklo aprašymas ir naudojimo pavyzdžiai

O dabar atėjo eilė penktajai ciklo temai. Jame ir toliau apžvelgsiu bash apvalkalo valdymo struktūras. Ankstesnis įrašas apėmė sąlyginius pareiškimus. Dabar atėjo laikas tokioms integralioms kalbos struktūroms kaip kilpos teiginiai. Ciklai, kaip ir sąlygos, yra įrankiai, leidžiantys valdyti komandų vykdymo tvarką.
Bash palaiko, while, till ir select kilpas. Dabar pažvelkime į kiekvieną iš jų atidžiau.

ciklo teiginiui

Bendra for teiginio sintaksė yra tokia:

kintamajam
daryti
komandų sąrašas
padaryta

For kilpa bash labai skiriasi nuo for ciklo programavimo kalbose, tokiose kaip C arba PHP. Taigi, jei esate C programuotojas, turėsite priprasti prie šių skirtumų, kad nesusipainiotumėte.
Dėl šablono pakeitimo gaunamas žodžių sąrašas. Kiekvienos iteracijos metu kintamasis įgauna kiekvieną paskesnę šio sąrašo reikšmę, o komandos tarp do ir done yra vykdomos. Iteracijos sustoja, kai baigiasi sąraše esantys žodžiai.
$ už dieną pirmadienį Antradienį Trečiadienį Penk
Teiginiui rezervuoti žodžiai taip pat gali būti rašomi vienoje eilutėje, kaip ir ankstesniame if teiginio įraše. Norėdami tai padaryti, įdėkite ";". Perrašykime ankstesnį pavyzdį turėdami omenyje šią funkciją:
$ už dieną pirmadienį antradienį trečiadienį penktadienį; daryti echo "Šiandien yra $diena"; padaryta
Konstrukcijos nebuvimas prilygsta rašymui $@. $@ parametras buvo aptartas .

while ciklus teiginys

Bendra teiginio while sintaksė yra tokia:

o sąrašas1
daryti
sąrašas2
padaryta

Sąrašas1 vykdomas pirmiausia. Jei tai pavyksta, t.y. grąžina kodą nulis, valdymas pereina į list2. Iteracijos tęsiasi tol, kol sąrašo1 vykdymo rezultatas tampa ne nulis. Pavyzdžiui:
i=10, o [ $i -gt 0 ]; do echo $i i=$(($i-1)) padaryta; aidas "pabaiga"

teiginys iki kilpos

Bendra iki teiginio sintaksė yra tokia:

iki sąrašo1
daryti
sąrašas2
padaryta

Sąrašas1 vykdomas pirmiausia. Jei nepavyksta, ty naudojant ne nulinį grąžinimo kodą, valdymas perduodamas list2. Iteracijos tęsiasi tol, kol sąrašo1 vykdymo rezultatas tampa nulis. Pavyzdžiui:
i=10 iki [ $i -lt 0 ]; do echo $i i=$(($i-1)) padaryta; aidas "pabaiga"

pasirinkite ciklo teiginį

Bendra pasirinkimo teiginio sintaksė yra tokia:

pasirinkti kintamąjį
daryti
sąrašą
padaryta

Dėl šablono pakeitimo gaunamas žodžių sąrašas. Operatorius prie šių žodžių prideda serijos numerius ir išveda visą rinkinį į standartinį klaidų srautą. Konstrukcijos nebuvimas prilygsta rašymui $@. Po to rodomas raginimas ir nuskaitoma eilutė iš standartinio įvesties srauto. Jei eilutėje yra skaičius, atitinkantis bet kurį žodį iš sąrašo, tada kintamasis gauna šį skaičių kaip reikšmę. Jei tinkamas žodis nerastas, kintamojo reikšmė tampa tuščia eilute. Po to vykdomas komandų sąrašas, o iteracija tęsiama tol, kol įvesties eilutėje randamas failo pabaigos simbolis arba kol komandų sąraše atsiranda pertrauka ar grįžimas.
Pertraukos ir grįžimo komandos naudojamos ciklo eigai valdyti. Pertraukimo komanda nutraukia ciklo vykdymą, o return grąžina rezultato kodą (nulis arba ne nulis).
Pažymėjimas yra naudingas kuriant sunumeruotus meniu. Pavyzdžiui, ~/temp kataloge yra 3 failai: proto.txt, file.txt ir readme. Scenarijaus fragmento, leidžiančio greitai peržiūrėti bet kurį iš jų, pavyzdys.
echo "Pasirinkite peržiūrėti failą:" pasirinkite failą ~/temp/* Baigti; do if [ -f $failas ]; tada katė $failas; Kita pertrauka; baigta
Vykdydami šį scenarijų ekrane pamatysime:
Pasirinkite failą, kurį norite peržiūrėti:
1) /home/istergul/temp/file.txt
2) /home/istergul/temp/proto.txt
3) /home/istergul/temp/readme
4) Mesti

Kitoje temoje bus nagrinėjami sąlyginiai parametrų pakeitimai. Laukiu jūsų komentarų.

Šioje paskaitoje toliau susipažįstame su bash. Noriu priminti, kad mes svarstome tuos elementus bash kad padėtų mums suprasti scenarijus Operacinė sistema. Tokie elementai tikrai yra ciklai ir funkcijos. Jei kas nors studijavo programavimą, suprasti šiuos klausimus nebus sunku.

už kilpą

Ciklas dėl V bash turi du tipus. Pirmiausia apsvarstykite klasikinę versiją dėl. Bendras vaizdas yra toks:

Tarp elementų dėl Ir in nustatomas kintamasis, kuris savo ruožtu paima reikšmę iš reikšmių sekos, pateiktos tarp in Ir daryti. Tarp daryti Ir padaryta yra komandų, kurios vykdomos kiekvieną kartą, kai kintamasis pakeičia savo reikšmę. Ciklas sustoja, kai kintamasis įgauna paskutinę sekos reikšmę. Sekos reikšmės atskirtos tarpu.

Ir čia yra praktinis pavyzdys:

Vertybių seka gali būti nurodyta įvairiais būdais. Aiškiai – kaip aukščiau esančiame pavyzdyje, arba kitų kintamųjų pagalba, arba specialių komandų pagalba. Pažvelkime į keletą pavyzdžių. Kadangi reikšmės yra atskirtos tarpu, bet koks kintamasis, kuriame yra eilutė su tarpais, gali būti naudojamas kaip tokios reikšmės:

Rezultatas bus toks pat kaip ir pirmame pavyzdyje.

Jei reikia nurodyti skaičių seką, galite naudoti komandą sek ir pakeitimo mechanizmas. Komanda sek grąžina į ekraną skaitinių reikšmių seką. Sintaksė yra paprasta ir bus aiški iš toliau pateikto pavyzdžio:

Rezultatas:

Grįžkime prie antrojo tipo. dėl. Dažnai scenarijuose galite rasti vadinamąją C tipo parinktį dėl, kuris naudojamas skaičiais pagrįstoms kilpoms. Pažvelkime į pavyzdį:

Ciklas vykdomas, kol reiškinyje tikrinama sąlyga yra teisinga. Kai tik išraiška grįžta false, ciklas nutraukiamas.

Praktinis pavyzdys:

#!/bin/bash
i=1
kol [ $i -lt 7 ]
daryti
aidas $i
tegul i=i+1
padaryta

Mūsų pavyzdyje patikriname, ar kintamasis i mažiau nei (-lt), rodomas skaičius 7 ir jei taip, tada rodoma kintamojo reikšmė. Išraiška tegul i=i+1, padidina kintamąjį vienu, patikrina dar kartą ir pan. let nurodo interpretatoriui, kad argumentai turi būti traktuojami kaip skaitinės reikšmės. Šią eilutę galima parašyti kaip tegul i++(panašus į c variantą). Kai skaičius padidinamas daugiau nei vienu, jis gali būti parašytas taip: tegul i+=2- tokiu atveju i padidės 2 žingsniais. Kitas būdas padidinti kintamąjį yra naudoti įmontuotą skaičiuotuvą (veikia tik su sveikaisiais skaičiais). Skaičiuoklę galima pasiekti per dvigubus skliaustus: i=$(($i+1)) arba per kvadratą: i=$[$i+1] Taip pat galite naudoti skaičiuotuvą komandinėje eilutėje:

Naudodami kilpas turite būti atsargūs, kad neatsirastumėte begalinės kilpos parinkties. Beje, dėl derinimo bash scenarijus, pirmąją eilutę galite pakeisti į #!/bin/bash -x arba paleiskite scenarijų su komanda bash-x:

[apsaugotas el. paštas]:~/linux$ bash -x ./testfor.sh
+ i = 1
+ „[‘ 1 -gt 5 ‘]“
+ echo i=1
i=1
+ tegul i=i+1
+ „[‘ 2 -gt 5 ‘]“
+ aidas i=2
i=2
+ tegul i=i+1
+ „[‘ 3 -gt 5 ‘]“
+ aidas i=3
i=3
+ tegul i=i+1
+ „[‘ 4 -gt 5 ‘]“
+ echo i=4
i=4
+ tegul i=i+1
+ „[‘ 5 -gt 5 ‘]“
+ echo i=5
i=5
+ tegul i=i+1
+ „[‘ 6 -gt 5 ‘]“

Būtinai praktikuokite rašydami mažus scenarijus, kad suprastumėte, kaip veikia kilpos bash.

Funkcijos bash

Funkcijos taikomos bash labai platus. Funkcijos aprašomos dviem būdais: raktiniu žodžiu funkcija, ir be jo.

Pirmas būdas:

funkcijos funkcijos_pavadinimas
{
veikiantis kūnas
}

Antras būdas:

funkcijos_pavadinimas()
{
veikiantis kūnas
}

Funkcija iškviečiama pavadinimu bet kurioje scenarijaus vietoje, bet tik po pačios funkcijos aprašymo. Taip pat funkcijoms gali būti perduodami parametrai, kurie nurodomi tarpu po funkcijos iškvietimo (pavadinimo). Apsvarstykite scenarijaus pavyzdį bash:

#!/bin/bash
funkcinis gruntas
{
jei [ $# -ne 0 ]
tada
vietinis a=1
echo "Perduotų parametrų skaičius - $#"
man $@
daryti
echo "$ a-tas parametras- $i
tegul a++
padaryta
grąžinti 0
Kitas
echo "Parametrai nepateikti"
grąžinti 1
fi
}
echo "Funkcijos su parametrais iškvietimas:"
gruntas a b c
echo $?
echo "Funkcijos be parametrų iškvietimas:"
gruntas
echo $?

IN šis pavyzdys suteikta funkcija pavadinta gruntas. Funkcijos su parametrais iškvietimas: gruntas a b c ir be parametrų: gruntas. Funkcijos turinyje visi konstruktai turėtų būti žinomi, išskyrus $# , $i Ir $@ .$# - grąžina funkcijai perduotų parametrų skaičių. Mūsų pavyzdyje tai bus skaičius 3 .$@ grąžina visus parametrus vienoje eilutėje. Pavyzdyje taip būtų a b c. Ir per $1 , $2 , $3 ir tt kiekvieną parametrą galite pasiekti atskirai. $? - yra paskutinės komandos vykdymo kodas. Mūsų pavyzdyje funkcijos vykdymo kodas.

Funkcija taip pat gali grįžti skaitinė reikšmė per raktinį žodį grąžinti. Paprastai jie grąžina 0, jei funkcija atlikta be klaidų, arba ne nulinę reikšmę, jei kažkas nutiko. Pavyzdyje funkcijos iškvietimo su parametrais atveju grąžinama reikšmė 0, o jei funkcija buvo iškviesta be parametrų, bus grąžintas kodas 1.

Viskas apie parametrų perdavimą funkcijai veikia lygiai taip pat ir scenarijui. Taip pat galite perduoti parametrus scenarijui ir manipuliuoti jais tokiu pačiu būdu naudodami $#, $@, $N. Iš tos pačios kategorijos ir parinkties - $0 - kuris grąžina komandos, kuri paleido scenarijų, pavadinimą. Jei scenarijus buvo paleistas pagal komandą ./script.sh, tada aidas $0 grąžins vertę ./script.sh, o jei pagal komandą /home/igor/linux/script.sh, tada vertė bus grąžinta /home/igor/linux/script.sh.

Viena iš pagrindinių sistemos administravimo taisyklių gali būti išreikšta taip: jei tą patį reikia daryti dažnai, parašykite scenarijų ir leiskite jam atlikti darbą už jus. Jei scenarijuje reikia atlikti tam tikrą veiksmą kelis kartus, naudokite ciklai. IN GNU Bash galite sukurti kilpas su konstrukcijomis dėl, kol Ir iki.

Jei kada nors domėjotės programavimu, tikėtina, kad jau esate susipažinę su šiomis konstrukcijomis. Jei, kaip ir aš, studijuojate bash Jei neturite programavimo patirties, kilpų naudojimas gali būti nepakankamai akivaizdus, ​​kad suprastumėte. Pradėkime nuo skirtumų tarp įvairių tipų ciklų, o tada pereikite prie pavyzdžių.

Ciklas dėl skirta kartoti veiksmus, kol jie visi bus baigti. Pavyzdžiui, įsivaizduokite, kad turite vaizdų katalogą ir turite juos konvertuoti iš vieno formato į kitą. Galite naudoti kilpą dėl kartu su programa Paversti iš pakuotės ImageMagick(ar kokią kitą programą), pavyzdžiui, norėdami konvertuoti vaizdus iš JPEG formato į PNG formatą. Arba, pavyzdžiui, gali tekti konvertuoti daug garso failų iš MP3 V OGG Vorbis.

Ciklas kol naudojamas veiksmams kartoti Ate atlikta (yra tiesa) tam tikra sąlyga. Ciklas iki veikia kiek kitaip: atlieka veiksmą iki kol bus įvykdyta sąlyga. Taigi, pavyzdžiui, galite atremti ir atlikti veiksmą iki kol jo reikšmė pasieks 10. Pažvelkime į tai išsamiau su pavyzdžiais.

Pradėkime nuo kilpos dėl. Jo formatas yra:

i $ (komanda); atlikti komandą $i; padaryta

Jei naudojate kilpą dėl scenarijuje geriau jį suformatuoti taip:

#!/bin/bash for i į $(komandą); do komandą $ aš padariau

Taigi, pavyzdžiui, jei reikia padaryti atsargines kopijas visus HTML failus kataloge, galite naudoti šią komandą:

i, $(ls *html); do cp $i $i.bak; padaryta

Taip sukuriamas vietinis kintamasis $i, komanda vykdoma ls*html, kurių rezultatai bus duomenys, inicijuojantys kintamojo reikšmę $i kiekvienoje ciklo iteracijoje (mūsų pavyzdyje tai bus komandos grąžintų failų sąrašas ls, po vieną kiekvienai iteracijai). Toliau vykdoma komanda cp, kuriam tarp parametrų perduodamas kintamasis $i.

Kas nors gali paklausti, ar privaloma naudoti raidę "aš" kaip kintamasis pavadinimas? Nr. Galite naudoti bet kokį galiojantį bash kintamasis pavadinimas. Žinoma, scenarijuose geriau naudoti prasmingesnius kintamųjų pavadinimus, pvz $ įvestis arba $html.

Pateikiau labai trumpą ir paprastą kilpos naudojimo pavyzdį dėl. Vietoj komandos, vykdomos bloke daryti, naudokite aidas norėdami pamatyti jam perduodamus parametrus. Tai labai naudinga praktika scenarijų testavimo etape, taip pat geras būdas padėti jums suprasti savo darbą išsamiau dėl.

kol ir iki

Dabar apsvarstykite konstrukcijas kol Ir iki. Be to, šiek tiek naudosime bash sąlygines sąlygas. Savo pavyzdyje juos naudosime norėdami nustatyti, pavyzdžiui, ar kintamojo reikšmė didesnė ar mažesnė už skaičių X; ar failas egzistuoja ir ar tai katalogas. Sąlygas taip pat galite naudoti norėdami nustatyti, pavyzdžiui, ar failas yra skaitomas, ar jo leidimuose yra GID bitas.

Pabandykime padaryti ką nors paprasto, pavyzdžiui, sukurti tuščius failus. Gyvenime tai vargu ar jums bus naudinga, bet, pavyzdžiui, tai yra pats dalykas.

#!/bin/bash i=0, kol [ $i -lt 22 ] palieskite $i i=$[$i+1] padaryta

Šis scenarijus sukurs 22 failus, kurių pavadinimai nuo 0 iki 21. Ciklas veiks iki Ate kintamoji vertė $i mažiau ( -lt) 22.

Dabar atsikratykime sugeneruotų failų su kilpa iki:

#!/bin/bash i=0 iki [ $i -eq 22 ] do rm $i i=$[$i+1] atlikta

Čia mes pakeitėme kolįjungta iki, o sąlyginėje išraiškoje pakeitėme "mažiau" (-lt) įjungta "lygus" (-ekv). Taigi, mūsų scenarijus veiks tol, kol jo vertė $i nepasieks 22. Ir vietoj liesti mes naudojom rm norėdami ištrinti failus, o ne juos kurti. Paprasta, tiesa?

Kilpos yra itin patogus dalykas rašant bet kokias programas ar scenarijus, o tiksliau – būtinas. Jie leidžia mums atlikti tam tikrą kodo dalį tam tikrą skaičių kartų. Natūralu, kad bash turi keletą rūšių kilpų. Aprašysime ciklus už į, už, kol, iki. Nors for in ir for laikomi skirtingomis to paties teiginio sintaksėmis, mano nuomone, jos skiriasi viena nuo kitos labiau nei while nuo iki.

Kilpa su įėjimo skaitikliu:

Ciklas už in tai kilpa su skaitikliu. Kodo blokas, esantis ciklo korpuse, kartojamas tiek kartų, kiek yra reikšmių operatoriaus for sąraše, o kiekvieno kartojimo metu skaitiklio kintamasis (čia jis vadinamas var, bet, žinoma, galite vadinkite jį kaip norite) turi kito sąrašo elemento reikšmę.
Jei raktinis žodis do yra toje pačioje eilutėje kaip žodis for, tada po argumentų sąrašo (prieš do) turite įdėti kabliataškį.
Kiekvienas iš elementų<список>gali būti daug argumentų. Tai naudinga apdorojant parametrų grupes. Šiuo atveju priversti išanalizuoti kiekvieną argumentą<списке>, turite naudoti rinkinio teiginį
Kintamąjį galite naudoti kaip sąrašą cikle for.
IN<списке>kilpoms gali būti naudojami failų pavadinimai, kuriuose gali būti pakaitos simbolių. Tai gali būti labai naudinga dirbant su daugybe failų.
Jeigu<список>nėra nurodytas cikle for, tada kaip jis naudojamas kintamasis $@ – komandinės eilutės argumentų sąrašas.
Kuriant argumentų sąrašą, komandų pakeitimas gali būti naudojamas cikle for.
Ciklo išvestis gali būti nukreipta iš stdout į failą arba kur nors kitur (daugiau apie tai galite sužinoti analizuodami I / O peradresavimą).

Sintaksė:
var in<список>
daryti
<выполняемые команды>
padaryta

Pavyzdys:
vardams vardas1 vardas2 vardas3 vardas4
daryti
echo $names
padaryta

Ciklo teiginys dėl turi kitą rašymo būdą - labai panašią į operatoriaus for sintaksę C kalba. Tokiu atveju, inicijuojant skaitiklius, nustatomos pradinės kintamųjų reikšmės arba vienas kintamasis ir po kiekvieno perėjimo ciklo sąlyga patikrinama, jei patikrinimas grąžina teisingą, tada prasideda kitas ciklo praėjimas. Bloke<приращение счётчиков>mūsų kintamųjų skaitiklių reikšmė būtinai turi keistis (nebūtinai aukštyn), kad tikrinant sąlygą anksčiau ar vėliau gautume melo reikšmę, antraip ciklas niekada nesibaigs. Labai patogus ir svarbiausia pažįstamas variantas, jei kurią nors operaciją reikia kartoti nurodytą skaičių kartų.

Su panašia sintaksė:
dėl ((<инициализация счётчиков>; <проверка условия>; <приращение счётчиков>))
daryti
<выполняемые команды>
padaryta

Pavyzdys:
for ((var=1; var<= LIMIT ; var++))
daryti
echo $var
padaryta

o ciklas:

Tai gana paprasta konstrukcija, kuri tikrina operatoriaus būklę kol ir jei ši sąlyga yra teisinga, ji vykdo komandų bloką, esantį tarp žodžių do ir done, ir vėl pradeda tikrinti sąlygą. Jei patikrinimas grąžina klaidingą, ciklas baigiasi ir vykdomos šios komandos: padaryta. Būtina tai užtikrinti<проверка условия>priklausė nuo cikle veikiančio kodo kitu atveju, jei patikrinimo rezultatas nepasikeis, gausite begalinę kilpą.
Standartinė įvestis tam tikrą laiką gali būti nukreipta į failą naudojant peradresavimo komandą< в конце цикла.

Sintaksė:
kol<Проверка условия>
daryti
<Блок команд, обязательно меняющий переменные влияющие на проверку условия>
padaryta

Pavyzdys:
o [ $var0 -eq 100 ]
daryti
echo $var
var++
padaryta

operatorius kol gali turėti kelias sąlygas. Tačiau tik paskutinis iš jų lemia galimybę tęsti ciklą. Tokiu atveju ciklo sakinio sintaksė skirsis nuo įprastos.
Sintaksė(Dar kartą kartoju, kad tik paskutinė sąlyga turi įtakos ciklo vykdymui) :
kol
<условие1>
<условие2>

<условиеN>
daryti
<выполняемые команды - тело цикла>
padaryta

iki ciklo:

operatorius iki labai panašus į while, jis taip pat įvertina sąlygą, bet vykdo ciklo turinį, jei skaičiavimo rezultatas klaidingas. Gali atrodyti keista, bet kol neįvertina sąlygos prieš pirmą ciklo iteraciją, pavyzdžiui, while, o ne po jos. Kaip ir ciklo for/in atveju, įdėdami raktinį žodį do toje pačioje eilutėje kaip ir ciklo deklaracija, turite įterpti simbolį ";" prieš tai padaryti.
Kaip ir ankstesniu atveju, svarbu atsiminti, kad sąlyga turi priklausyti nuo operacijų ciklo korpuse, kitaip mūsų scenarijus niekada nesibaigs.

Sintaksė:
iki<Проверка условия>
daryti
<Блок команд, обязательно меняющий переменные влияющие на проверку условия>
padaryta

Pavyzdys:
iki [ $var0 -gt 100] # Sąlyga patikrinama iteracijos pradžioje.
daryti
echo $var
var--
padaryta

Tikriausiai kol kas užteks. :)

  • Atgal
  • Persiųsti

Nauji straipsniai:

  • Tinklo aptikimas neįsijungia Windows 2008-07-08
  • Klaida: šios programos nepavyko paleisti, nes ji negalėjo rasti arba įkelti Qt platformos papildinio „langai“.
  • Automatinio darbo procesų paleidimo iš naujo konfigūravimas rphost.exe serveris 1C 8.3
  • Kaip sumažinti operacijų žurnalo (.ldf) dydį MS SQL 2008/20012

    MS SQL, kaip ir bet kuri tinkama pramoninė DBVS, kartu su duomenų baze saugo operacijų žurnalus, leidžiančius grąžinti būseną ...

5

Jūsų scenarijus užkoduotas pavojingai.

Pirma, darau prielaidą, kad naudojate „Bash“ apvalkalą, nes pažymėjote jį „/bash“ ir „/for“.

Savo atsakyme pacituosiu šį puikų Bash vadovą, kuris tikriausiai yra geriausias šaltinis mokytis Bash.

1) Niekada nenaudokite komandų pakeitimo , out arba malonus, be kabučių. Čia yra didelė problema: naudojant nekabutuotą išplėtimą, norint padalyti išvestį į argumentus.

Tiksliau sakant, šis $(find$ DIRWORK -type d -name work) ir $(find$ DIR -type f) bus suskaidytas, taigi, jei Find randa failą su tarpais jo pavadinime, t. y. žodis "failo pavadinimas" padalija „Bash“ rezultatas perduos 2 argumentus komandai „for“, kad būtų galima pakartoti, t. y. vieną „failui“ ir vieną „pavadinimui“. Šiuo atveju norite tikėtis, kad gausite „failas: tokio failo ar katalogo nėra“ ir „pavadinimas: tokio failo ar katalogo nėra“, o ne potencialiai sugadinsite juos, jei jie egzistuoja.

2) Pagal susitarimą aplinkos kintamieji (PATH, EDITOR, SHELL, ...) ir vidiniai apvalkalo kintamieji (BASH_VERSION, RANDOM, ...) rašomi didžiosiomis raidėmis. Visi kiti kintamųjų pavadinimai turi būti rašomi mažosiomis raidėmis. Kadangi kintamųjų pavadinimuose skiriamos didžiosios ir mažosios raidės, taikant šį susitarimą išvengiama atsitiktinio aplinkos ir vidinių kintamųjų apibrėžimo.

Tai yra saugesnė scenarijaus versija, kurią rekomenduoju naudoti:

Mano_namai="/root/mydir" my_dir=" $mano_namai/var" dir_work="$ my_home/Local", o IFS= skaityti -r -d "" f; do # Spėju, kad taip pat norite nepaisyti stderr; # štai iš kur atsirado 2>&1. jei lsof -n "$f" | grep "" > /dev/null 2> tada echo "hey , Aš dabar saugiau! baigta< <(find "$ dir_work" -type f -print0) while IFS= read -r -d "" f; do echo "2" done < <(find "$dir_work" -type d -name "work" -print0)

Kaip matote, IFS kintamasis yra tuščias, todėl skaitymas neleidžia apkarpyti eilutės priekinių ir galinių tarpų. skaitymo komanda naudoja tuščią eilutę (-d "") kaip skirtuką, kad būtų galima skaityti, kol pasiekia \ 0. rasti turi būti atitinkamai m, todėl ji naudoja parinktį -print0, kad atskirtų duomenis \ 0, o ne naujos eilutės, kuris yra , stebėtinai ir piktybiškai, gali būti failo pavadinimo dalis. Padalijus tokį failą į \n į dvi dalis, mūsų kodas sulaužys.

Ankstesnis atsakymas, kuriame teigiama, kad rasti ... | o skaitymo vardas; daryti...; done turėtų būti naudojamas skaityti find s išvestis taip pat gali būti bloga. Ciklas while vykdomas naujame antriniame apvalkale, kurio kintamųjų kopija nukopijuota iš pirminio. Tada ši kopija naudojama tam, kas jums patinka. Kai ciklas while bus baigtas, subshell kopija bus atmesta ir pirminiai pradiniai kintamieji nebus pakeisti.

Jei ketinate pakeisti kai kuriuos kintamuosius šioje while ciklo viduje ir naudoti juos vėliau pirminėje sistemoje, apsvarstykite galimybę naudoti saugesnį scenarijų, kuris apsaugotų nuo duomenų praradimo.

0

"Niekada nenaudokite komandų pakeitimo be kabučių." Tai tik niekinimas, bet galima naudoti komandų pakeitimą be kabučių, kai nustatote kintamąjį: "something = $(basename" failo pavadinimas su tarpais ")". - Smitas Džonas Balandžio 22 d. 13 2013-04-22 21:43:10 val

2

For i in $(rasti $ DIRWORK -type d -name darbas); padaryti echo "2" padaryta

bus pirmasis, kuris atliks šią eilutę

Raskite $DIRWORK -type d -name darbą

palaukite, kol paieška baigs vykdyti, tada paimkite išvestį ir grąžinkite ją į for kilpą

For i išvestyje rasti; padaryti echo "2" padaryta

tik tada bus pradėta vykdyti for kilpa.

Taigi, jei paieška užtrunka ilgai, kol bus užbaigta už kilpa, jis turi ilgai laukti, kol bus galima pradėti.

Išbandykite interaktyvias laikinas paieškos komandas

$ laikas rasti $DIRWORK -type d -name darbą

ir pažiūrėk kiek tai užtrunka.

Taip pat atminkite, kad neturėtumėte naudoti for ciklo kartoti failų pavadinimus. Naudokite while kilpą su skaitymu, pavyzdžiui:

Find$ DIRWORK -type d -name work | o skaitymo vardas; padaryti echo "2" padaryta

Premija: jis vykdo while kilpą lygiagrečiai su find . Tai reiškia, kad while ciklas atliks vieną iteraciją, kai tik Find išspausdins vieną eilutę. Jums nereikia laukti, kol paieška bus baigta.

mob_info