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

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

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

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

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

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

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

Установить rsstail

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

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

 sudo apt-get install rsstail 

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

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

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

 zypper install rsstail 

Заявление IF

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

 sudo nano rssget.sh 

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

 #!/bin/bash 
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/баш 
 if [$ 1 = "verbose"] 
then
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
ц

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

 sh rssget.sh verbose 

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

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

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

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

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

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

 #!/Bin/баш 
 if [$ 1 = "verbose"] 
then
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;
fi

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

 sh rssget.sh verbose 

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

 sh rssget.sh title 

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

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

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

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

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

 #!/Bin/баш 
 if [$ 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;
 else 
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

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

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

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

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

 #!/Bin/баш 
 if [$ 2 = "aboutdotcom"] 
затем
if [$ 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/о/м/linux_p2.xml;
 else 
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
else
if [$ 1 = " все "]
затем
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 =" описание "]
затем
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
else
rsstail -u http://z.about.com/6/o /m/linux_p2.xml;
fi
fi

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

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

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

 sh rssget.sh all aboutdotcom 

или же

 sh rssget.sh all 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 = "title"]
затем
if [$ 2 = "aboutdotcom"]
затем
if [$ 1 = "all"]
затем
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;
 else 
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
else
if [$ 1 = " все "]
затем
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 =" описание "]
затем
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
else
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 = “title”] проверяет, равен ли 1-й параметр “all” или “description” или “title”.

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

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

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

 #!/Bin/баш 
 if [$ # -eq 2] 
then
 if [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] 
затем
if [$ 1 = "all"] || [$ 1 = "описание"] || [$ 1 = "title"]
затем
if [$ 2 = "aboutdotcom"]
затем
if [$ 1 = "all"]
затем
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;
 else 
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
else
if [$ 1 = " все "]
затем
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 =" описание "]
затем
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
else
rsstail -u http://z.about.com/6/o /m/linux_p2.xml;
фантастический
фантастический
фантастический
фантастический
фантастический

Единственный дополнительный бит в этом скрипте – это другой внешний оператор IF следующим образом: 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
;;
title)
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
;;
description)
rsstail -d -u http://lxer.com/module/newswire/headlines .rss
;;
название)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

Заявление о ситуации – более хороший способ написания 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"
display = "" < br /> url = ""
 if [$ # -lt 2] || [$ # -gt 2] 
затем
echo "использование: rssget.sh [все | описание | заголовок] [aboutdotcom | lxer]";
выход;
fi
 case $ 1 во всех 
)
display = "- d -l -u"
;;
описание)
display = "- d -u"
;;
title)
display = "- u"
;;
esac
 case $ 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"
dailylinuxuser = "http: //feeds.feedburner.com/everydaylinuxuser/WLlg "
linuxtoday =" http://feedproxy.google.com/linuxtoday/linux "
Использование =" Использование: rssget.sh [все | описание | title] [lxer | aboutdotcom | dailylinuxuser | linuxtoday] "
display =" "
url =" "
 if [$ # -lt 2] || [$ # -gt 2] 
затем
повторить использование $;
выход;
fi
 case $ 1 во всех 
)
display = "- d -l -u"
;;
описание)
display = "- d -u"
;;
title)
display = "- u"
;;
*)
использование echo $;
выход;
;;
esac
 case $ 2 в 
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
dailylinuxuser)
url = $ dailylinuxuser;
;;
*)
echo $ using;
выход;
esac
 rsstail $ display $ url; 

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

Резюме

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

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

Оцените статью
Solutics.ru
Добавить комментарий