Skip to main content

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

LPIC 105.1 часть вторая. Bash: функции и псевдонимы (Июнь 2025)

LPIC 105.1 часть вторая. Bash: функции и псевдонимы (Июнь 2025)
Anonim

Вступление

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

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

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

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

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

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

Установить rsstail

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

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

sudo apt-get install rsstail

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

yum install rsstail

Для типа openSUSE:

zypper install rsstail

Утверждение IF

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

sudo nano rssget.sh

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

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

Сохраните файл, нажав CTRL и O, а затем выйдите, нажав CTRL и X.

Запустите сценарий, введя следующее:

sh rssget.sh

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

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

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

#! / Bin / Баш

если $ 1 = "verbose"затем rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;фи

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

sh rssget.sh verbose

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

Давайте проанализируем скрипт в деталях:

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

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

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

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

#! / Bin / Баш

если $ 1 = "verbose"затем 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 verbose

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

Записи sh rssget.sh

На этот раз появляется только список названий.

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

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

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

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

#! / Bin / Баш

если $ 1 = "all"затем rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "description"затем 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;фи

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

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

Это вводит способ быстрого составления списка условных операторов. Альтернативный способ ELIF - использовать то, что известно как вложенные операторы IF.

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

#! / Bin / Баш

если $ 2 = "aboutdotcom"затем если $ 1 = "all" затем rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" затем 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 = "all" затем rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" затем 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 все aboutdotcom

или же

sh rssget.sh all lxer

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

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

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

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

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

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

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

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

#! / Bin / Баш

если $ 2 = "aboutdotcom" || $ 2 = "lxer"затем если $ 1 = "все" || $ 1 = "description" || $ 1 = "title" затем если $ 2 = "aboutdotcom" затем если $ 1 = "all" затем rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" затем 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 = "all" затем rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" затем rsstail -d -u http://lxer.com/module/newswire/headlines.rss еще rsstail -u http://z.about.com/6/o/m/linux_p2.xml; фи фи фифи

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

Битом, который важен в этом скрипте, является оператор IF || оператора THEN в строке 2 и строке 4.

|| означает OR. Таким образом, линияесли $ 2 = "aboutdotcom" || $ 2 = "lxer"проверяет, равен ли второй параметр «aboutdotcom» или «lxer». Если это не так, оператор IF завершен, потому что нет еще заявление для внешнего ЕСЛИ.

Аналогично на линии 4 линия если $ 1 = "все" || $ 1 = "description" || $ 1 = "title"проверяет, равен ли первый параметр «все» или «описание» или «название».

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

Противоположность || является &&. Оператор && обозначает AND.

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

#! / Bin / Баш

если $ # -eq 2затем

если $ 2 = "aboutdotcom" || $ 2 = "lxer" затем если $ 1 = "все" || $ 1 = "description" || $ 1 = "title" затем если $ 2 = "aboutdotcom" затем если $ 1 = "all" затем rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" затем 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 = "all" затем rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" затем 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, Если вы прочитаете статью о входных параметрах, вы узнаете, что $ # возвращает количество входных параметров. -Eq означает равные. Поэтому оператор 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 fruit = бананыТогдаELSE IF фрукты = апельсиныТогдаELSE IF фрукты = виноградТогдаКОНЕЦ ЕСЛИ

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

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

В основном первый пункт после случая - это то, что вы собираетесь сравнить (например, фрукты). Тогда каждый элемент перед скобками - это то, с чем вы сравниваете, и если оно соответствует строкам, предшествующим ;; будет запущено. Заявление о случаях завершается обратным esac (это случай назад).

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

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

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

#! / Bin / Баш

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

если $ # -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; ;;ESACrsstail $ display $ url;

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

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

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

Теперь переменная отображения устанавливается в зависимости от того, выбрали ли вы все, описание или название, а переменная url установлена ​​на значение переменной aboutdotcom или значение переменной lxer в зависимости от того, выбрали ли вы aboutdotcom или lxer.

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

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

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

#! / 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 | everydaylinuxuser | linuxtoday"Дисплей = «»URL = ""

если $ # -lt 2 || $ # -gt 2затем echo $ usage; выход;фи

дело $ 1 в все) display = "- d -l -u" ;; описание) display = "- d -u" ;; заглавие) дисплей = «- и» ;; *) echo $ usage; выход; ;;ESAC

дело $ 2 в aboutdotcom) URL = $ aboutdotcom; ;; lxer) URL = $ lxer; ;; LinuxToday) URL = $ LinuxToday; ;; everydaylinuxuser) URL = $ everydaylinuxuser; ;; *) echo $ usage; выход;ESAC

rsstail $ display $ url;

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

Резюме

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

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

Ознакомьтесь с разделом linux.about.com раздела «Как прокрутить страницу вниз, чтобы просмотреть список статей»), чтобы найти более полезные руководства по двойной загрузке Windows и Ubuntu для настройки виртуальной машины с помощью ящиков GNOME.