Руководство для начинающих по Bash — условия и переменные

Добро пожаловать в третью часть «Руководства для начинающих по BASH». Если вы пропустили две предыдущие статьи, вы, вероятно, захотите узнать, чем это руководство отличается от других руководств по написанию сценариев BASH.

Это руководство написано полным новичком в BASH, и как читатель вы узнаете, как я учусь. Несмотря на то, что я новичок в BASH, я пришел из среды разработки программного обеспечения, хотя большая часть того, что я написал, была для платформы Windows.

Вы можете увидеть первые два руководства, посетив:

  • Руководство для начинающих BASH — Hello World
  • Руководство для начинающих по BASH — входные параметры

Если вы новичок в написании сценариев BASH, я рекомендую прочитать первые два руководства, прежде чем продолжить с этим.

В этом руководстве я расскажу, как использовать условные операторы для проверки пользовательского ввода и управления работой скрипта.

Установить rsstail

Чтобы следовать этому руководству, вам нужно установить приложение командной строки под названием rsstail, которое используется для чтения RSS-каналов.

Если вы используете дистрибутив Debian / Ubuntu / Mint, введите следующее:

sudo apt-get установить rsstail

Для Fedora / CentOS и т. Д. Введите следующее:

ням установить rsstail

Для openSUSE введите следующее:

zypper установить rsstail

Заявление IF

Откройте терминал и создайте файл с именем rssget.sh, введя следующее:

sudo nano rssget.sh

В редакторе нано введите следующий текст:

#! / Bin / Баш
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Сохраните файл, нажав CTRL а также О и затем выйти, нажав CTRL а также Икс.

Запустите скрипт, набрав следующее:

sh rssget.sh

Сценарий вернет список заголовков из RSS-канала linux.about.com.

Это не слишком полезный сценарий, поскольку он просто извлекает заголовки из одного RSS-канала, но при этом не требует запоминания пути к RSS-каналу Linux.about.com.

Снова откройте скрипт rssget.sh в nano и отредактируйте файл следующим образом:

#! / Bin / Баш
if [$ 1 = "подробный"]
тогда
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
фи

Запустите скрипт еще раз, набрав следующее:

sh rssget.sh подробный

На этот раз лента RSS возвращается с заголовком, ссылкой и описанием.

Давайте проанализируем сценарий немного подробнее:

#! / Bin / bash появляется в каждом скрипте, который мы пишем. Следующая строка в основном смотрит на первый входной параметр, предоставленный пользователем, и сравнивает его со словом «подробный». Если входной параметр и слово «verbose» совпадают с линиями между then и fi, они запускаются. 

Приведенный выше скрипт явно ошибочен. Что произойдет, если вы вообще не предоставите входной параметр? Ответ в том, что вы получаете сообщение об ошибке неожиданного оператора.

Другой главный недостаток заключается в том, что если вы не предоставите слово «многословный», то ничего не произойдет вообще. В идеале, если вы не предоставите слово verbose, скрипт вернет список заголовков.

Снова используйте nano, чтобы отредактировать файл rssget.sh и изменить код следующим образом:

#! / Bin / Баш
if [$ 1 = "подробный"]
тогда
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
еще
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фи

Сохраните файл и запустите его, набрав следующее:

sh rssget.sh подробный

Появится список заголовков, описаний и ссылок. Теперь запустите его снова следующим образом:

sh rssget.sh title

На этот раз просто список названий.

Дополнительная часть скрипта находится в строке 4 и представляет оператор else. По сути, скрипт теперь говорит, что если первым параметром является слово «verbose», получите описание, ссылки и заголовки для RSS-канала, но если первым параметром является что-то еще, просто получите список заголовков. 

Сценарий немного улучшился, но все еще имеет недостатки. Если вам не удастся ввести параметр, вы все равно получите ошибку. Даже если вы предоставите параметр, просто сказать, что вы не хотите многословно, не означает, что вы хотите только заголовки. Например, вы, возможно, только что написали неправильное слово, или, возможно, вы напечатали голубей, что, конечно, бессмысленно.

Прежде чем мы попытаемся решить эти проблемы, я хочу показать вам еще одну команду, которая идет с оператором IF.

Отредактируйте ваш скрипт rssget.sh, чтобы он выглядел следующим образом:

#! / Bin / Баш
если [$ 1 = "все"]
тогда
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "описание"]
тогда
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
еще
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фи

Я решил избавиться от многословного слова и заменил его всем. Это не важная часть. Скрипт, представленный выше, представляет elif, что является коротким способом сказать ELSE IF. 

Теперь скрипт работает следующим образом. Если вы бежите sh rssget.sh все тогда вы получите описания, ссылки и названия. Если вместо этого вы просто бежите ш Описание rssget.sh вы просто получите названия и описания. Если вы введете любое другое слово, вы получите список названий.

Это позволяет быстро составить список условных операторов. Альтернативный способ выполнения ELIF — использовать так называемые вложенные операторы IF.

Ниже приведен пример, показывающий, как работают вложенные операторы IF:

#! / Bin / Баш
if [$ 2 = "aboutdotcom"]
тогда
если [$ 1 = "все"]
тогда
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "описание"]
тогда
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
   еще
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фи
еще
если [$ 1 = "все"]
тогда
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "описание"]
тогда
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
еще
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фи
фи

Не стесняйтесь набирать все это, если хотите, или скопируйте и вставьте его в свой файл rssget.sh. 

Приведенный выше скрипт вводит второй параметр, который позволяет вам выбрать либо «about.com», либо «lxer.com» RSS-канал.

Чтобы запустить его, введите следующее:

sh rssget.sh все проdotcom

или же

sh rssget.sh все lxer

Конечно, вы можете заменить все описаниями или заголовками, чтобы предоставить только описания или заголовки.

По сути, приведенный выше код говорит, что если вторым параметром является aboutdotcom, тогда посмотрите на второй оператор if, который является тем же оператором из предыдущего скрипта, в противном случае, если вторым параметром является lxer, тогда снова посмотрите на внутренний оператор if, чтобы решить, показывать ли заголовки, описания или все.

Этот сценарий представлен исключительно как пример вложенного оператора IF, и в этом сценарии так много неправильных вещей, что потребуется еще одна статья, чтобы объяснить их все. Основная проблема заключается в том, что он не масштабируется. 

Представьте, что вы хотите добавить еще один канал RSS, например Everyday Linux User или Linux Today? Сценарий станет огромным, и если вы решите, что хотите изменить внутренний оператор IF, вам придется изменить его в нескольких местах.

Хотя есть время и место для вложенного ЕСЛИ, их следует использовать с осторожностью. Обычно существует способ реорганизовать ваш код, чтобы вам вообще не понадобился вложенный IF. Я подойду к этой теме в следующей статье.

Давайте теперь посмотрим на исправление проблемы людей, вводящих параметры duff. Например, в приведенном выше сценарии, если пользователь вводит что-то кроме «aboutdotcom» в качестве второго параметра, то из RSS-канала LXER появляется список статей независимо от того, введет ли пользователь lxer или нет.

Кроме того, если пользователь не вводит «все» или «описание» в качестве 1-го параметра, то по умолчанию используется список заголовков, который может соответствовать или не соответствовать тому, что предполагал пользователь.

Посмотрите на следующий скрипт (или скопируйте и вставьте его в файл rssget.sh).

#! / Bin / Баш
if [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
тогда
if [$ 1 = "all"] || [$ 1 = "описание"] || [$ 1 = "заголовок"]
тогда
if [$ 2 = "aboutdotcom"]
тогда
если [$ 1 = "все"]
тогда
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "описание"]
тогда
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
         еще
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фи
еще
если [$ 1 = "все"]
тогда
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "описание"]
тогда
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
еще
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фи
фи
фи
фи

Первое, на что нужно обратить внимание, — это то, что сценарий теперь становится довольно большим, и вы можете быстро увидеть, как могут выйти из-под контроля вложенные операторы IF.

Немаловажный момент в этом скрипте — оператор IF || Заявление ПОТОМ раздел в строке 2 и строке 4.

|| обозначает ИЛИ. Итак, линия if [$ 2 = «aboutdotcom»] || [$ 2 = «lxer»] проверяет, равен ли 2-й параметр «aboutdotcom» или «lxer». Если это не так, то оператор IF завершен, потому что для самого внешнего IF нет оператора else.

Аналогично в строке 4 if [$ 1 = «all»] || [$ 1 = «описание»] || [$ 1 = «заголовок»] проверяет, равен ли 1-й параметр «всем», «описанию» или «названию». 

Теперь, если пользователь запускает sh rssget.sh картофель сыр ничего не возвращается, тогда как раньше они получили бы список названий от LXER.

Противоположность || является , оператор выступает за И.

Я собираюсь сделать сценарий еще более похожим на кошмар, но он делает очень важную проверку, чтобы убедиться, что пользователь предоставил 2 параметра.

#! / Bin / Баш
если [$ # -eq 2]
тогда
   if [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
тогда
if [$ 1 = "all"] || [$ 1 = "описание"] || [$ 1 = "заголовок"]
тогда
if [$ 2 = "aboutdotcom"]
тогда
если [$ 1 = "все"]
тогда
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "описание"]
тогда
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
            еще
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фи
еще
если [$ 1 = "все"]
тогда
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "описание"]
тогда
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
еще
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фи
фи
фи
фи
фи

 

Единственный дополнительный бит в этом скрипте — это другой внешний оператор IF следующим образом: если [$ # -eq 2]. Если вы прочитаете статью о входных параметрах, то узнаете, что $ # возвращает количество входных параметров. -Экв обозначает равных. Поэтому оператор IF проверяет, что пользователь ввел 2 параметра, и если они этого не сделали, он просто завершает работу, ничего не делая. (Не особо дружелюбно).

Я знаю, что этот урок становится довольно большим. На этой неделе освещать особо нечего, но я хочу помочь привести в порядок сценарий, прежде чем мы закончим.

Последней командой, которую вам нужно узнать об условных выражениях, является инструкция CASE.

#! / Bin / Баш

если [$ # -eq 2]
тогда
дело 2 $ в
aboutdotcom)
дело 1 в
все)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
описание)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
заглавие)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
ESAC
;;
lxer)
дело 1 в
все)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
описание)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
заглавие)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
ESAC
;;
ESAC
фи

Заявление о ситуации — более хороший способ написания IF ELSE IF ELSE IF ELSE IF.

Например эта логика

ЕСЛИ фрукты = бананы
ТОГДА это
ELSE IF фрукты = апельсины
ТОГДА это
ELSE IF фрукты = виноград
ТОГДА это
КОНЕЦ ЕСЛИ

можно переписать как:

дело фрукты
бананы)
сделай это
;;
апельсины)
сделай это
;;
виноград)
сделай это
;;
ESAC

По сути, первым предметом после дела является то, что вы собираетесь сравнивать (то есть фрукты). Тогда каждый элемент перед скобками — это то, с чем вы сравниваете, и соответствует ли оно предыдущим строкам ;; будет работать Оператор case завершается обратным esac (что является регистром в обратном порядке).

В сценарии rssget.sh оператор case удаляет некоторые из этих ужасных вложений, хотя на самом деле недостаточно улучшает их.

Чтобы действительно улучшить скрипт, мне нужно познакомить вас с переменными. 

Посмотрите на следующий код:

#! / Bin / Баш
lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
Дисплей = «»
URL = ""
if [$ # -lt 2] || [$ # -gt 2]
тогда
echo "использование: rssget.sh [все | описание | заголовок] [aboutdotcom | lxer]";
Выход;
фи
дело 1 в
все)
display = "- d -l -u"
;;
описание)
display = "- d -u"
;;
заглавие)
дисплей = «- и»
;;
ESAC
дело 2 $ в
aboutdotcom)
URL = $ aboutdotcom;
;;
lxer)
URL = $ lxer;
;;
ESAC
rsstail $ display $ url;

Переменная определяется путем присвоения ей имени и последующего присвоения ей значения. В приведенном выше примере следующие назначения переменных:

lxer = «lxer.com/module/newswire/headlines.rss»
aboutdotcom = «z.about.com/6/o/m/linux_p2.xml»
Дисплей = «»
URL = «»

Сценарий мгновенно более управляем, используя переменные. Например, каждый параметр обрабатывается отдельно, и поэтому нет вложенных операторов IF.

Переменная отображения теперь устанавливается в зависимости от того, выбрали ли вы all, description или title, а для переменной URL установлено значение переменной aboutdotcom или значение переменной lxer, в зависимости от того, выбрали ли вы aboutdotcom или lxer.

Команда rsstail теперь просто должна использовать значения display и url для корректной работы. 

В то время как переменные устанавливаются просто путем присвоения им имени, для фактического использования их необходимо поставить знак $ перед ними. Другими словами, variable = value устанавливает переменную в значение, тогда как $ variable означает, что я передаю содержимое переменной.

Ниже приведен финальный скрипт для этого урока.

#! / Bin / Баш
lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
LinuxToday = "http://feedproxy.google.com/linuxtoday/linux"
использовании = "использование: rssget.sh [все | описание | название] [lxer | aboutdotcom | dailylinuxuser | linuxtoday]"
Дисплей = «»
URL = ""
if [$ # -lt 2] || [$ # -gt 2]
тогда
использование echo $;
Выход;
фи
дело 1 в
все)
display = "- d -l -u"
;;
описание)
display = "- d -u"
;;
заглавие)
дисплей = «- и»
;;
*)
использование echo $;
Выход;
;;
ESAC
дело 2 $ в
aboutdotcom)
URL = $ aboutdotcom;
;;
lxer)
URL = $ lxer;
;;
LinuxToday)
URL = $ LinuxToday;
;;
everydaylinuxuser)
URL = $ everydaylinuxuser;
;;
*)
использование echo $;
Выход;
ESAC
rsstail $ display $ url;

 

Вышеупомянутый скрипт вводит больше RSS-каналов, и есть переменная использования, которая говорит пользователю, как использовать скрипт, если они либо не вводят 2 переменные, либо вводят неверные опции для переменных.

Резюме

Это была эпическая статья, и, возможно, она зашла слишком рано. В следующем руководстве я покажу вам все варианты сравнения для операторов IF, и еще многое предстоит обсудить в отношении переменных.

Для улучшения описанного выше сценария можно сделать еще кое-что, и об этом будет рассказано в следующих руководствах, когда мы будем изучать циклы, grep и регулярные выражения.

Ссылка на основную публикацию