Сценарий datecp Revisited
В первом выпуске нашего руководства по написанию сценариев мы создали скрипт, который скопировал файл в резервный каталог после добавления даты в конец имени файла.
Самюэль Дионн-Риель в комментариях отметил, что есть намного лучший способ справиться с нашими переменными ссылками.
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 он использует команду «echo» с первым аргументом скрипта для вывода имени файла. Он использует команду pipe для получения этого вывода и использует его как вход для следующей части. После трубки 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.
Повторение команд с циклами
Давайте перейдем к одному из самых полезных инструментов арсенала geek для решения повторяющихся задач: циклов. Сегодня мы будем обсуждать петли «за».
Основной контур for-loop выглядит следующим образом:
for VARIABLE in LIST; do command1 command2 … commandn done
VARIABLE может быть любой переменной, хотя чаще всего нижний регистр «i» используется по соглашению. СПИСОК - список элементов; вы можете указать несколько элементов (разделяя их пробелом), указать внешний текстовый файл или использовать звездочку (*) для обозначения любого файла в текущем каталоге. Перечисленные команды имеют отступы по соглашению, поэтому легче видеть вложенные петли в петлях (так что вы можете петлять во время цикла).
Поскольку списки используют пробелы в качестве разделителей, т. Е. Пространство означает переход к следующему элементу в списке - файлы с пробелами в имени не очень дружелюбны. На данный момент давайте будем работать с файлами без пробелов. Давайте начнем с простого скрипта, чтобы отображать имена файлов в текущем каталоге. Создайте новый скрипт в папке ~ / bin /, озаглавленной «loopscript». Если вы не помните, как это сделать (в том числе отметить его как исполняемый файл и добавить хеш-взлом), обратитесь к нашей статье bash scripting basics.
В нем введите следующий код:
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
Для петель довольно замечательно. Теперь вы можете выполнять пакетные функции в списках файлов. Например, вы можете скопировать все аргументы вашего скрипта в архив с застежкой-молнией, переместить оригиналы в другую папку и автоматически защитить копию этого zip-файла на удаленном компьютере. Если вы настроите файлы ключей с помощью SSH, вам даже не потребуется вводить пароль, и вы даже можете сказать скрипту удалить zip-файл после его загрузки!
Использование for-loops упрощает выполнение множества действий для всех файлов в каталоге. Вы можете складывать множество различных команд и использовать аргументы очень легко для создания и на лету списка, и это только верхушка айсберга.
У вас есть предложения? Вы создали полезный скрипт, который использует циклы? Хотите поделиться своими мыслями о сериале? Оставьте несколько комментариев и помогите другим новичкам создавать скрипты!