Начална » как да » Ръководство за начинаещи за скриптовете на Shell 2 за цикли

    Ръководство за начинаещи за скриптовете на Shell 2 за цикли

    Ако искате да изградите вашата кредитна машина, присъединете се към нас за втората вноска в нашата серия скриптове. Имаме няколко корекции, няколко подобрения на сценария от миналата седмица, както и наръчник за привързване към непосветените.

    Repeited за скрипта datecp

    В първата част от нашето ръководство за скриптове за скриптове, направихме скрипт, който копира файл в резервен каталог след като добави датата в края на името на файла.

    Samuel Dionne-Riel посочи в коментарите, че има много по-добър начин да се справим с променливите ни референции.

    Аргументите са разделени в пространството в черупката на bash, ще маркират, когато има пространство в получената разширена команда. Във вашия скрипт, cp $ 1 $ 2. $ date_formatted ще работи по предназначение, докато разширените променливи нямат интервали в тях. Ако се обадите на скрипта по следния начин: datecp "старото ми име" "новото ми име" разширението ще доведе до тази команда: cp новото ми име е моето старо име което всъщност има 6 аргумента.

    За да разрешите правилно този проблем, последният ред на скрипта трябва да бъде: cp "$ 1" "$ 2. $ date_formatted"

    Както виждате, променяте линията на нашия скрипт от:

    cp -iv $ 1 $ 2. $ date_formatted

    да се:

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

    ще се погрижи за този проблем, когато използва скрипта на файлове, които имат интервали в името. Самуел също така подчертава, че при копиране и поставяне на код от този сайт (или в интернет като цяло) не забравяйте да замените правилните тирета и кавички за „типографски по-добри“ такива, които често ги заменят. Също така ще правим повече, за да сме сигурни, че кодът е по-приятелски за копиране / поставяне. ;-)

    Друг коментатор, Майлс Брейтуейт, реши да разшири сценария ни, така че датата да се появи преди разширението на файла. Така че вместо

    tastyfile.mp3.07_14_11-12.34.56

    ще получим това:

    tastyfile.07_14_11-12.34.56.mp3

    което е малко по-удобно за повечето потребители. Неговият код е достъпен на страницата му в GitHub. Нека да разгледаме какво използва, за да раздели името на файла.

    date_formatted = $ (дата +% 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

    Промених форматирането малко, но можете да видите, че Myles обявява функцията си за дата в ред 1. В ред 2 обаче той използва командата „echo“ с първия аргумент на скрипта, за да изведе името на файла. Той използва командата pipe, за да приеме този изход и да го използва като вход за следващата част. След тръбата, Myles призовава командата „awk“, която е мощна програма за сканиране на шаблони. Използвайки -F флаг, той казва на командата, че следващият символ (след интервал) е това, което ще определи "разделител на поле". В този случай това е период.

    Сега awk вижда файл с име “tastyfile.mp3” като съставен от две полета: “tastyfile” и “mp3”. Накрая той използва

    'print $ NF'

    , за да се покаже последното поле. В случай, че файлът ви има няколко периода, което означава, че awk ще вижда много полета, ще се покаже само последното, което е разширението на файла.

    В ред 3 той създава нова променлива за името на файла и използва командата „basename“, за да се позове на всичко в $ 1 с изключение разширението на файла. Това се прави, като се използва basename и се дава $ 1 като аргумент, след което се добавя интервал и файлово разширение. Файловото разширение се добавя автоматично, защото на променливата, която се позовава на Линия 2. Това ще направи

    tastyfile.mp3

    и го превърнете в

    tastyfile

    След това в последния ред Myles сглоби командата, която ще изведе всичко в ред. Имайте предвид, че няма препратка към $ 2, втори аргумент за скрипта. Този конкретен скрипт ще копира споменатия файл в текущата ви директория. Страхотна работа Самуел и Майлс!

    Стартиране на скриптове и $ PATH

    Ние също споменаваме в нашата статия Basics, че скриптовете не могат да бъдат споменавани като команди по подразбиране. Това означава, че трябва да посочите пътя на скрипта, за да го стартирате:

    ./ скрипт

    ~ / Хамбар / скрипт

    Но, като поставите скриптовете си в ~ / bin /, можете просто да напишете техните имена от всяко място, за да ги накарате да работят.

    Коментатори прекараха известно време в дебати за това как е правилно това, тъй като нито една модерна Linux дистрибуция не създава тази директория по подразбиране. Освен това никой не го добавя към променливата $ PATH по подразбиране, което е необходимо, за да могат скриптовете да се изпълняват като команди. Бях малко озадачен, защото след проверка на моята променлива $ PATH, коментаторите бяха прави, но обаждащите се скриптове все още работеха за мен. Разбрах защо: много съвременни дистрибуции на Linux създават специален файл в домашната директория на потребителя - .profile.

    Този файл се чете от bash (освен ако в домашната директория на потребителя няма .bash_profile) и в долната част има раздел, който добавя папката ~ / bin / към променливата $ PATH, ако съществува. Така че тази мистерия се изяснява. За останалата част от поредицата, ще продължа да поставям скриптове в директорията ~ / bin /, защото те са потребителски скриптове и трябва да могат да се управляват от потребителите. И изглежда, че не е нужно да се бърка с променливата $ PATH на ръка, за да работим нещата.

    Повтарящи се команди с цикли

    Нека стигнем до един от най-полезните инструменти в арсенала на маниаците за справяне с повтарящи се задачи: цикли. Днес ще обсъждаме "за" цикли.

    Основният контур на for-loop е както следва:

    за VARIABLE в LIST; правя
    command1
    command2
    ...
    commandn
    Свършен

    VARIABLE може да бъде всяка променлива, въпреки че най-често буквата „i“ се използва по конвенция. LIST е списък с елементи; можете да посочите няколко елемента (разделяйки ги с интервал), да посочите външен текстов файл или да използвате звездичка (*), за да обозначите всеки файл в текущата директория. Командите, изброени по-долу, са отстъпени по обичайния начин, така че е по-лесно да видите вмъкване - поставяне на цикли в бримки (така че да можете да циклирате, докато циклично).

    Тъй като списъците използват интервали като разделители - това означава, че интервал означава преместване към следващия елемент в списъка - файловете, които имат интервали в името, не са много приятелски настроени. За сега нека се придържаме към работата с файлове без интервали. Да започнем с прост скрипт, за да покажете имената на файловете в текущата директория. Създайте нов скрипт във вашата папка ~ / bin /, озаглавен “loopscript”. Ако не си спомняте как да направите това (включително маркиране като изпълним и добавяне на хеш банг), вижте статията ни за bash скриптове.

    Въведете следния код:

    за i в т.1 т.2 т.3 т.4 т.5; правя
    ехо "$ i"
    Свършен

    Когато стартирате скрипта, трябва само да получите тези елементи от списъка като изходни.

    Доста проста, нали? Нека да видим какво ще се случи, ако променим нещата малко. Променете скрипта си, така че се казва следното:

    за i in *; правя
    ехо "$ i"
    Свършен

    Когато стартирате този скрипт в папка, трябва да получите списък с файлове, които той съдържа като изход.

    Сега, нека променим командата echo в нещо по-полезно - да речем, командата zip. А именно, ще добавяме файлове в архив. И нека да разберем някои аргументи в микса!

    за i в $ @; правя
    zip архив „$ i“
    Свършен

    Има нещо ново! “$ @” Е пряк път за “$ 1 $ 2 $ 3… $ n”. С други думи, това е пълният списък на всички аргументи, които сте посочили. Сега вижте какво се случва, когато стартирам скрипта с няколко входни файла.

    Можете да видите кои файлове са в папката ми. Стартирах командата с шест аргумента и всеки файл беше добавен към архивиран архив, наречен “archive.zip”. Лесно, добре?

    За примки са доста прекрасни. Сега можете да изпълнявате пакетни функции в списъци с файлове. Например, можете да копирате всички аргументи на вашия скрипт в архивиран архив, да преместите оригиналите в друга папка и автоматично да защитите копирането на този пощенски файл на отдалечен компютър. Ако зададете ключови файлове с SSH, дори няма да е необходимо да въвеждате паролата си и дори можете да кажете на скрипта да изтрие пощенския файл, след като го качите.!


    Използването на for-loops улеснява извършването на множество действия за всички файлове в директорията. Можете да събирате голямо разнообразие от команди заедно и да използвате аргументи много лесно, за да създадете и влезете в списъка, и това е само върхът на айсберга..

    Bash scripters, имате ли някакви предложения? Направихте ли полезен скрипт, който използва цикли? Искате да споделите мислите си за поредицата? Оставете някои коментари и помогнете на други начинаещи скриптове!