Linux

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

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

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

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

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

Установить rsstail

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

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

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

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

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

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

Заявление IF

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

sudo nano rssget.sh

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

#! / bin / bash 
rsstail -u https://www.espn.com/espn/rss/news;

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

Убедитесь, что скрипт исполняемый.

chmod + x rssget.sh

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

sh rssget.sh

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

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

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

#! / bin / bash 
if [$ 1 = "verbose"]
затем
rsstail -d -l -u https://www.espn.com/espn/rss/news;
фи

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

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

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

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

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

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

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

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

#! / bin / bash 
if [$ 1 = "verbose"]
затем
rsstail -d -l -u https://www.espn.com/espn/rss/news;
иначе
rsstail -u https://www.espn.com/espn/rss/news;
фи

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

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

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

sh rssget.sh title

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

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

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

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

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

#! / bin / bash 
if [$ 1 = "all"]
затем
rsstail -d -l -u https://www.espn.com/espn/rss/news;
elif [$ 1 = "description"],
затем
rsstail -d -u https://www.espn.com/espn/rss/news;
иначе
rsstail -u https://www.espn.com/espn/rss/news;
фи

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

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

Это позволяет быстро составить список условных операторов. Альтернативный способ сделать elif состоит в том, чтобы использовать то, что известно как вложенные операторы if .

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

#! / bin / bash 
if [$ 1 = "baseball"],
то
если [$ 2 = "all"],
то
rsstail -d -l -u https://www.espn.com/espn/rss/mlb/news;
elif [$ 2 = "description"],
затем
rsstail -d -u https://www.espn.com/espn/rss/mlb/news;
    иначе
rsstail -u https://www.espn.com/espn/rss/mlb/news;
Fi
еще ,
если [$ 2 = "все"] ,
то
rsstail -d -l -u https://www.espn.com/espn/rss/news;
elif [$ 2 = "description"],
затем
rsstail -d -u https://www.espn.com/espn/rss/news;
иначе
rsstail -u https://www.espn.com/espn/rss/news;
фи
фи

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

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

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

sh rssget.sh бейсбол все

или же

sh rssget.sh что-нибудь все

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

По сути, приведенный выше код говорит, что если первым параметром является «baselball», тогда посмотрите на второй оператор if, который является тем же оператором из предыдущего скрипта. В противном случае, если первым параметром является что-то еще, отображаются общие заголовки из ESPN. Оттуда, в любом случае, он снова посмотрел бы на внутренний оператор if, чтобы решить, показывать ли заголовки, описания или все остальное.

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

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

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

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

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

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

#! / bin / bash 
if [$ 1 = "headlines"] || [$ 1 = "бейсбол"]
тогда
если [$ 2 = "все"] || [$ 2 = "описание"] || [$ 2 = "title"]
тогда
если [$ 1 = "заголовки"],
то
если [$ 2 = "все"],
то
rsstail -d -l -u https://www.espn.com/espn/rss/news;
elif [$ 2 = "description"],
затем
rsstail -d -u https://www.espn.com/espn/rss/news;
          иначе
rsstail -u https://www.espn.com/espn/rss/news;
Fi
еще ,
если [$ 2 = "все"] ,
то
rsstail -d -l -u https://www.espn.com/espn/rss/mlb/news;
elif [$ 2 = "описание"]
затем
rsstail -d -u https://www.espn.com/espn/rss/mlb/news;
иначе
rsstail -u https://www.espn.com/espn/rss/mlb/news;
фи
фи
фи
фи

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

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

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

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

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

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

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

#! / bin / bash 
if [$ # -eq 2]
затем
if [$ 1 = "headlines"] || [$ 1 = "бейсбол"]
тогда
если [$ 2 = "все"] || [$ 2 = "описание"] || [$ 2 = "title"]
тогда
если [$ 1 = "заголовки"],
то
если [$ 2 = "все"],
то
rsstail -d -l -u https://www.espn.com/espn/rss/news;
elif [$ 3 = "description"],
затем
rsstail -d -u https://www.espn.com/espn/rss/news;
             иначе
rsstail -u https://www.espn.com/espn/rss/news;
Fi
еще ,
если [$ 2 = "все"] ,
то
rsstail -d -l -u https://www.espn.com/espn/rss/mlb/news;
elif [$ 2 = "description"]
тогда
rsstail -d -u https://www.espn.com/espn/rss/mlb/news;
иначе
rsstail -u https://www.espn.com/espn/rss/mlb/news;
фи
фи
фи
фи
фи

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

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

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

#! / bin / bash, 

если [$ # -eq 2],
тогда
в
заголовках указывается $ 2 )
в
общем случае - $ 1 )
rsstail -d -l -u https://www.espn.com/espn/rss/news
;;
описание)
rsstail -d -u https://www.espn.com/espn/rss/news
;;
title)
rsstail -u https://www.espn.com/espn/rss/news
;;
esac
;;
бейсбол) всего
$ 1
)
rsstail -d -l -u https://www.espn.com/espn/rss/mlb/news
;;
описание)
rsstail -d -u https://www.espn.com/espn/rss/mlb/news
;;
title)
rsstail -u https://www.espn.com/espn/rss/mlb/news
;;
ESAC
;;
esac
fi

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

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

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

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

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

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

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

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

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

#! / bin / bash 
baseball = "https://www.espn.com/espn/rss/mlb/news"
headlines = "https://www.espn.com/espn/rss/news"
display = ""
url = ""
if [$ # -lt 2] || [$ # -gt 2]
затем
повторить "use: rssget.sh [все | описание | заголовок] [заголовки | бейсбол]";
выход;
Fi
случай $ 1
все)
дисплей = "- д -l -u"
;;
описание)
display = "- d -u"
;;
title)
display = "- u"
;;
esac
case $ 2 в
заголовках)
url = $ headlines;
;;
бейсбол)
url = $ baselball;
;;
esac
rsstail $ display $ url;

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

baseball = «https://www.espn.com/espn/rss/mlb/news»
headlines = «https://www.espn.com/espn/rss/news»
display = «»
url = «»

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

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

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

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

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

#! / bin / bash 
baseball = "https://www.espn.com/espn/rss/mlb/news"
headlines = "https://www.espn.com/espn/rss/news"
football = "https : //www.espn.com/espn/rss/nfl/news "ball
= "https://www.espn.com/espn/rss/nba/news"
использовании = "использование: rssget.sh [все | описание | title] [бейсбол | заголовки | футбол | баскетбол] "
display =" "
url =" "
if [$ # -lt 2] || [$ # -gt 2]
затем
повторить использование $;
выход;
Fi
случай $ 1
все)
дисплей = "- д -l -u"
;;
описание)
display = "- d -u"
;;
title)
display = "- u"
;;
*)
использование echo $;
выход;
;;
ESAC
регистр $ 2 в
заголовках)
url = $ заголовки;
;;
бейсбол)
url = $ baseball;
;;
футбол)
URL = $ футбол;
;;
баскетбол)
url = $ баскетбол;
;;
*)
использование echo $;
выход;
esac
rsstail $ display $ url;

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

Похожие посты
Linux

8 лучших окружений рабочего стола Linux

AndroidIphone и ipadLinuxWindows

Окончательное руководство по включению темного режима везде

LinuxКак сделать

Что такое Swappiness в Linux? (и как это изменить)

LinuxКак сделать

Как использовать команду ls для вывода списка файлов и каталогов в Linux