Руководство для начинающих по созданию сценариев оболочки 2: для циклов

Оглавление:

Руководство для начинающих по созданию сценариев оболочки 2: для циклов
Руководство для начинающих по созданию сценариев оболочки 2: для циклов

Видео: Руководство для начинающих по созданию сценариев оболочки 2: для циклов

Видео: Руководство для начинающих по созданию сценариев оболочки 2: для циклов
Видео: Прохождение Atomic Heart — Часть 2: Комплекс «Вавилов» - YouTube 2024, Апрель
Anonim
Если вы хотите создать свой geek cred, присоединяйтесь к нам для второго взноса в нашей серии сценариев оболочки. У нас есть несколько исправлений, несколько улучшений для скрипта на прошлой неделе и руководство по циклизации для непосвященных.
Если вы хотите создать свой geek cred, присоединяйтесь к нам для второго взноса в нашей серии сценариев оболочки. У нас есть несколько исправлений, несколько улучшений для скрипта на прошлой неделе и руководство по циклизации для непосвященных.

Сценарий 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.

Этот файл читается bash (если только файл.bash profile присутствует в домашнем каталоге пользователя), а внизу находится раздел, который добавляет папку ~ / bin / в переменную $ PATH, если она существует. Итак, эта тайна проясняется. Для остальной части серии я продолжу размещение сценариев в каталоге ~ / bin /, потому что они являются пользовательскими скриптами и должны быть доступны пользователям. И, похоже, нам действительно не нужно возиться с переменной $ PATH вручную, чтобы заставить все работать.
Этот файл читается bash (если только файл.bash profile присутствует в домашнем каталоге пользователя), а внизу находится раздел, который добавляет папку ~ / bin / в переменную $ PATH, если она существует. Итак, эта тайна проясняется. Для остальной части серии я продолжу размещение сценариев в каталоге ~ / bin /, потому что они являются пользовательскими скриптами и должны быть доступны пользователям. И, похоже, нам действительно не нужно возиться с переменной $ PATH вручную, чтобы заставить все работать.

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

Давайте перейдем к одному из самых полезных инструментов арсенала 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

Когда вы запускаете этот скрипт в папке, вы должны получить список файлов, которые он содержит в качестве вывода.
Когда вы запускаете этот скрипт в папке, вы должны получить список файлов, которые он содержит в качестве вывода.
Теперь давайте изменим команду echo на что-то более полезное - скажем, на команду zip. А именно, мы добавим файлы в архив. И давайте примем некоторые аргументы в миксе!
Теперь давайте изменим команду echo на что-то более полезное - скажем, на команду zip. А именно, мы добавим файлы в архив. И давайте примем некоторые аргументы в миксе!

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

Есть что-то новое! «$ @» - это сокращение от «$ 1 $ 2 $ 3 … $ n». Другими словами, это полный список всех аргументов, которые вы указали. Теперь посмотрим, что произойдет, когда я запустил скрипт с несколькими входными файлами.
Есть что-то новое! «$ @» - это сокращение от «$ 1 $ 2 $ 3 … $ n». Другими словами, это полный список всех аргументов, которые вы указали. Теперь посмотрим, что произойдет, когда я запустил скрипт с несколькими входными файлами.
Вы можете видеть, какие файлы находятся в моей папке. Я выполнил команду с шестью аргументами, и каждый файл был добавлен в zipped архив с именем «archive.zip». Легко, правда?
Вы можете видеть, какие файлы находятся в моей папке. Я выполнил команду с шестью аргументами, и каждый файл был добавлен в zipped архив с именем «archive.zip». Легко, правда?

Для петель довольно замечательно. Теперь вы можете выполнять пакетные функции в списках файлов. Например, вы можете скопировать все аргументы вашего скрипта в архив с застежкой-молнией, переместить оригиналы в другую папку и автоматически защитить копию этого zip-файла на удаленном компьютере. Если вы настроите файлы ключей с помощью SSH, вам даже не потребуется вводить пароль, и вы даже можете сказать скрипту удалить zip-файл после его загрузки!

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

У вас есть предложения? Вы создали полезный скрипт, который использует циклы? Хотите поделиться своими мыслями о сериале? Оставьте несколько комментариев и помогите другим новичкам создавать скрипты!

Рекомендуемые: