Početna » kako da » Vodič za početnike za skriptiranje ljuske 2 za petlje

    Vodič za početnike za skriptiranje ljuske 2 za petlje

    Ako želite izgraditi svoj geek krediti, pridružite nam se za drugu ratu u seriji skripti. Imamo nekoliko ispravaka, nekoliko poboljšanja prošlotjednog scenarija i vodič za petlju za nepoduzetnike.

    Datoteka datecp Revisited

    U prvom izdanju našeg vodiča za skripte za skripte, napravili smo skriptu koja je kopirala datoteku u direktorij rezervne kopije nakon dodavanja datuma na kraj naziva datoteke.

    Samuel Dionne-Riel je u komentarima istaknuo da postoji mnogo bolji način za obradu referenci varijabli.

    Argumenti su odvojeni razmakom u bash ljusci, tokenirat će se kada postoji prostor u dobivenoj proširenoj naredbi. U vašem pismu, cp $ 1 $ 2. $ date_formatted će raditi kako je zamišljeno sve dok proširene varijable nemaju mjesta u njima. Ako skriptu tako nazovete: datecp "moje staro ime" "moje novo ime" proširenje će rezultirati ovom naredbom: cp moje novo ime moje staro ime.datum koji zapravo ima 6 argumenata.

    Da biste ispravno riješili taj problem, posljednji redak skripte trebao bi biti: cp "$ 1" "$ 2. $ date_formatted"

    Kao što možete vidjeti, promijenite liniju naše skripte iz:

    cp -iv $ 1 $ 2. $ date_formatted

    do:

    cp -iv “$ 1” “$ 2”. $ date_formatted

    će riješiti ovaj problem kada koristi skriptu na datotekama koje imaju razmake u imenu. Samuel također naglašava da prilikom kopiranja i lijepljenja koda s ove stranice (ili interneta općenito) svakako zamijenite odgovarajuće crtice i citate za "tipografski bolje" one koje ih često zamjenjuju. Radit ćemo i više kako bismo bili sigurni da je naš kod više kopiraj / lijepi. ;-)

    Drugi komentator, Myles Braithwaite, odlučio je proširiti našu skriptu kako bi se datum pojavio prije proširenja datoteke. Dakle, umjesto

    tastyfile.mp3.07_14_11-12.34.56

    dobili bismo ovo:

    tastyfile.07_14_11-12.34.56.mp3

    što je za većinu korisnika malo prikladnije. Njegov kod je dostupan na njegovoj GitHub stranici. Pogledajmo što on koristi za rastavljanje imena datoteke.

    date_formatted = $ (datum +% Y-% m-% d_% H.% M% S)
    file_extension = $ (echo "$ 1" | awk -F. 'print $ NF')
    file_name = $ (basename $ 1. $ file_extension)

    cp -iv $ 1 $ file_name- $ date_formatted. $ file_extension

    Malo sam promijenio formatiranje, ali možete vidjeti da Myles objavljuje svoju funkciju datuma u retku 1. U retku 2, međutim, on koristi naredbu "echo" s prvim argumentom skripte kako bi dao ime datoteke. On koristi naredbu cijevi da uzme taj izlaz i koristi ga kao ulaz za sljedeći dio. Nakon cijevi, Myles poziva "awk" naredbu, koja je moćan program za skeniranje uzoraka. Koristeći -F zastavicu, on naredbi kaže da je sljedeći znak (nakon razmaka) ono što će definirati "separator polja". U ovom slučaju, to je razdoblje.

    Sada, awk vidi datoteku pod nazivom “tastyfile.mp3” koja se sastoji od dva polja: “tastyfile” i “mp3”. Konačno, on koristi

    'print $ NF'

    za prikaz posljednjeg polja. U slučaju da vaša datoteka ima više razdoblja - tako da awk vidi više polja - prikazat će se samo posljednja, a to je ekstenzija datoteke.

    U retku 3, on stvara novu varijablu za ime datoteke i koristi naredbu "basename" za referencu svega u $ 1 osim datotečni nastavak. To se postiže korištenjem basename-a i njegovim argumentom od $ 1, zatim dodavanjem razmaka i ekstenzije datoteke. Ekstenzija datoteke se automatski dodaje zbog varijable koja upućuje na 2. redak. To bi trebalo poduzeti

    tastyfile.mp3

    i pretvorite ga u

    tastyfile

    Zatim u posljednjem retku, Myles je sastavio naredbu koja će ispisati sve u redu. Napominjemo da nema reference na $ 2, što je drugi argument za skriptu. Ova će skripta umjesto toga kopirati datoteku u vaš trenutni direktorij. Sjajan posao Samuel i Myles!

    Pokretanje skripti i $ PATH

    U članku Osnove također spominjemo da skriptama nije dopušteno referencirati kao naredbe prema zadanim postavkama. To jest, morate pokazati na putanju skripte da biste je pokrenuli:

    ./ script

    ~ / Bin / script

    No, postavljanjem vaših skripti u ~ / bin /, možete jednostavno upisati njihova imena s bilo kojeg mjesta kako bi ih pokrenuli.

    Komentatori su neko vrijeme raspravljali o tome kako je to ispravno, budući da nijedan moderni Linux distro ne stvara taj direktorij po defaultu. Nadalje, nitko ga ne dodaje u $ PATH varijablu po defaultu, što je potrebno da bi se skripte izvodile kao naredbe. Bio sam pomalo zbunjen, jer nakon provjere moje $ PATH varijable, komentatori su bili u pravu, ali pozivam skripte i dalje je radio za mene. Otkrio sam zašto: mnogi moderni Linux distrosi stvaraju posebnu datoteku u korisnikovom home direktorijumu - .profile.

    Ovu datoteku čita bash (osim ako je u korisnikovom matičnom direktoriju prisutan .bash_profile), a na dnu je odjeljak koji dodaje mapu ~ / bin / u varijablu $ PATH ako postoji. Dakle, ta se misterija raščišćava. Za ostatak serije nastavit ću s postavljanjem skripti u direktorij ~ / bin / jer su korisničke skripte i trebali bi ih moći pokrenuti korisnici. Čini se da se ne trebamo miješati ručno s $ PATH varijablom da bi stvari funkcionirale.

    Ponavljanje naredbi s petljama

    Idemo na jedan od najkorisnijih alata u geek arsenalu za rješavanje zadataka koji se ponavljaju: petlje. Danas ćemo raspravljati o "za" petlji.

    Osnovni nacrt for-loop-a je sljedeći:

    za VARIABLE u LISTU; čini
    command1
    command2
    ...
    commandn
    učinio

    VARIJABLE može biti bilo koja varijabla, iako se najčešće mala slova “i” koriste po dogovoru. LIST je popis stavki; možete odrediti više stavki (odvajajući ih razmakom), pokazivati ​​na vanjsku tekstualnu datoteku ili koristiti zvjezdicu (*) za označavanje bilo koje datoteke u trenutnom direktoriju. Navedene naredbe su uvučene po dogovoru, tako da je lakše vidjeti gniježđenje - stavljanje petlji u petlji (tako da možete petljati dok petljate).

    Budući da popisi koriste razmake kao graničnike - to jest, prostor označava prelazak na sljedeću stavku na popisu - datoteke koje imaju razmake u imenu nisu vrlo prijateljske. Za sada se držimo rada s datotekama bez razmaka. Počnimo s jednostavnom skriptom za prikaz imena datoteka u trenutnom direktoriju. Stvorite novu skriptu u mapi ~ / bin / pod nazivom "loopscript". Ako se ne sjećate kako to učiniti (uključujući označavanje kao izvršnu datoteku i dodavanje hash bang hack-a) pogledajte članak bash scripting.

    U njoj unesite sljedeći kôd:

    za i u točki 1., točka 2., točka 3. točka 4. točka 5. točka 6; čini
    echo "$ i"
    učinio

    Kada pokrenete skriptu, trebali biste dobiti te stavke popisa kao izlaz.

    Prilično jednostavno, zar ne? Da vidimo što će se dogoditi ako malo promijenimo stvari. Promijenite svoju skriptu tako da to kaže:

    za i in *; čini
    echo "$ i"
    učinio

    Kada pokrenete ovu skriptu u mapi, trebali biste dobiti popis datoteka koje sadrži kao izlaz.

    Sada ćemo promijeniti naredbu echo u nešto korisnije - recimo, zip naredbu. Naime, dodavat ćemo datoteke u arhivu. I, hajde da dobijemo neke argumente u miksu!

    za i u $ @; čini
    zip arhiva "$ i"
    učinio

    Ima nešto novo! "$ @" Je prečac za "$ 1 $ 2 $ 3… $ n". Drugim riječima, to je potpuni popis svih argumenata koje ste naveli. Sada pogledajte što se događa kada pokrenem skriptu s nekoliko ulaznih datoteka.

    Možete vidjeti koje su datoteke u mojoj mapi. Pokrenuo sam naredbu sa šest argumenata, a svaka je datoteka dodana u zip arhiv pod nazivom "archive.zip". Polako, dobro?

    Za petlje su prilično divne. Sada možete izvršavati skupne funkcije na popisima datoteka. Na primjer, možete kopirati sve argumente svoje skripte u zipovanu arhivu, premjestiti izvornike u drugu mapu i automatski zaštititi kopiranje te zip datoteke na udaljeno računalo. Ako postavite ključne datoteke s SSH-om, nećete morati unositi zaporku, a čak možete i skripti reći kako će izbrisati zip datoteku nakon prijenosa!


    Korištenje for-loops olakšava izvođenje hrpe radnji za sve datoteke u direktoriju. Možete složiti širok raspon naredbi zajedno i koristiti argumente vrlo lako za izradu i na-listi, a to je samo vrh ledenog brijega..

    Bash skripte, imate li kakvih prijedloga? Jeste li napravili korisnu skriptu koja koristi petlje? Želite li podijeliti svoja razmišljanja o seriji? Ostavite neke komentare i pomozite drugim skriptovima!