Сценарият за дата
В първата част от ръководството ни за скриптове на черупки направихме скрипт, който копира файл в директория за резервно копиране след добавяне на датата до края на името на файла.
Самуел Дион-Риел посочи в коментарите, че има много по-добър начин да се справим с нашите променливи референции.
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.
Повтарящи се команди с 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
for i in $@; do zip archive “$i” done
За веригите са прекрасни. Сега можете да изпълнявате партидни функции в списъци с файлове. Например, можете да копирате всички аргументи на вашия скрипт в архив с циркони, да преместите оригиналите в друга папка и автоматично да защитите копирането на този пощенски файл на отдалечен компютър. Ако настроите ключови файлове със SSH, няма да е нужно дори да въвеждате паролата си и дори можете да кажете на скрипта да изтрие пощенския файл след качването му!
Използването на for-loops прави лесно да направите куп действия за всички файлове в директорията. Можете да стекате голямо разнообразие от команди заедно и да използвате аргументи много лесно, за да създадете и да се движите в списък, а това е само върхът на айсберга.
Bash scripters, имате ли някакви предложения? Направихте ли полезен скрипт, който използва линии? Искате ли да споделите вашите мисли по поредицата? Оставете няколко коментара и помогнете на други начинаещи скриптове!