Ръководството на начинаещия за Shell Scripting 2: For Loops

Съдържание:

Ръководството на начинаещия за Shell Scripting 2: For Loops
Ръководството на начинаещия за Shell Scripting 2: For Loops

Видео: Ръководството на начинаещия за Shell Scripting 2: For Loops

Видео: Ръководството на начинаещия за Shell Scripting 2: For Loops
Видео: Экипаж (драма, фильм-катастрофа, реж. Александр Митта, 1979 г.) - YouTube 2024, Април
Anonim
Ако искате да създадете своето мнение, се присъединете към нас за втората част от нашата серия скриптове на черупки. Имаме няколко корекции, няколко подобрения на сценария от миналата седмица и ръководство за примамка за непосветените.
Ако искате да създадете своето мнение, се присъединете към нас за втората част от нашата серия скриптове на черупки. Имаме няколко корекции, няколко подобрения на сценария от миналата седмица и ръководство за примамка за непосветените.

Сценарият за дата

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

Самуел Дион-Риел посочи в коментарите, че има много по-добър начин да се справим с нашите променливи референции.

Arguments are space-separated in the bash shell, it will tokenize when there is a space in the resulted expanded command. In your script,

cp $1 $2.$date_formatted

ще работи по предназначение, докато разширените променливи нямат интервали в тях. Ако кажете скрипта си по следния начин:

datecp 'my old name' 'my new name'

разширението ще доведе до тази команда:

cp my new name my old name.the_date

който всъщност има 6 аргумента.

За да решите правилно този проблем, последният ред на сценария трябва да бъде:

cp '$1' '$2.$date_formatted'

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

cp -iv $1 $2.$date_formatted

да се:

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

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

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

tastyfile.mp3.07_14_11-12.34.56

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

tastyfile.07_14_11-12.34.56.mp3

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

date_formatted=$(date +%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 обаче използва командата "ехо" с първия аргумент на скрипта, за да изведе името на файла. Той използва командата за тръби, за да вземе този изход и да го използва като вход за следващата част. След тръбата Myles извиква командата "awk", която е мощна програма за сканиране на шаблони. Използвайки знака -F, той казва на командата, че следващият знак (след интервал) е това, което ще определи "сепаратора на поле". В този случай това е период.

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

‘{print $NF}’

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

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

tastyfile.mp3

и да го превърне в

tastyfile

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

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

Също така споменаваме в статията ни "Основи", че скриптовете не могат да се посочват по подразбиране като команди. Това означава, че трябва да посочите пътя на скрипта, за да го изпълните:

./script

~/bin/script

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

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

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

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

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

Основният контур на задвижването е както следва:

for VARIABLE in LIST; do command1 command2 … commandn done

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

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

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

for i in item1 item2 item3 item4 item5 item6; do echo “$i” done

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

for i in *; do echo “$i” done

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

for i in $@; do zip archive “$i” done

Има нещо ново! "$ @" Е пряк път за "$ 1 $ 2 $ 3 … $ n". С други думи, това е пълният списък на всички аргументи, които сте посочили. Гледайте какво се случва, когато стартирам скрипта с няколко входни файла.
Има нещо ново! "$ @" Е пряк път за "$ 1 $ 2 $ 3 … $ n". С други думи, това е пълният списък на всички аргументи, които сте посочили. Гледайте какво се случва, когато стартирам скрипта с няколко входни файла.
Можете да видите кои файлове са в моята папка. Изпълних командата с шест аргумента и всеки файл бе добавен към архив с архив с име "archive.zip". Лесно, нали?
Можете да видите кои файлове са в моята папка. Изпълних командата с шест аргумента и всеки файл бе добавен към архив с архив с име "archive.zip". Лесно, нали?

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

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

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

Препоръчано: