Files
2024-08-13 02:23:28 +00:00

6484 lines
123 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://linkedin.github.io/school-of-sre/level102/linux_intermediate/bashscripting/">
<link rel="prev" href="../introvim/">
<link rel="next" href="../conclusion/">
<link rel="icon" href="../../../img/favicon.ico">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.12">
<title>Bash Scripting - School Of SRE</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.7e359304.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../stylesheets/custom.css">
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#bash-scripting" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<script async defer data-domain="linkedin.github.io" src="https://tracking.eskratch.com/js/plausible.js"></script>
<script>document.addEventListener("DOMContentLoaded", function() {
if (document.getElementById("nav-2").checked!=true && document.getElementById("nav-3").checked!=true && window.innerWidth>1220){
document.getElementById("nav-2").checked=true;
document.getElementById("nav-3").checked=true;
}
});</script>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="header.title">
<a href="https://linkedin.github.io/school-of-sre/" title="School Of SRE" class="md-header__button md-logo" aria-label="School Of SRE">
<img src="../../../img/sos.png" alt="logo">
</a>
<!-- Button to open drawer -->
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<span class="md-header__topic md-ellipsis">
<a href="https://linkedin.github.io/school-of-sre/" title="School Of SRE" >
School Of SRE
</a>
</span>
<span class="md-header__topic md-ellipsis">
Bash Scripting
</span>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<!-- Determine classes -->
<!-- Navigation -->
<nav
class="md-nav md-nav--primary"
aria-label="Navigation"
data-md-level="0"
>
<!-- Repository information -->
<!-- Navigation list -->
<ul class="md-nav__list" data-md-scrollfix>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Home
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2"
id="__nav_2_label"
tabindex=""
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Level 101
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="1"
aria-labelledby="__nav_2_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Level 101
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_1"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_1"
id="__nav_2_1_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Fundamentals Series
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_2_1_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
Fundamentals Series
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_1_1"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_1_1"
id="__nav_2_1_1_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Linux Basics
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="3"
aria-labelledby="__nav_2_1_1_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_1_1">
<span class="md-nav__icon md-icon"></span>
Linux Basics
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_basics/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_basics/command_line_basics/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Command Line Basics
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_basics/linux_server_administration/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Server Administration
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_basics/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_1_2"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_1_2"
id="__nav_2_1_2_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Git
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="3"
aria-labelledby="__nav_2_1_2_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_1_2">
<span class="md-nav__icon md-icon"></span>
Git
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/git/git-basics/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Git Basics
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/git/branches/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Working With Branches
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/git/github-hooks/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Github and Hooks
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/git/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_1_3"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_1_3"
id="__nav_2_1_3_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Linux Networking
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="3"
aria-labelledby="__nav_2_1_3_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_1_3">
<span class="md-nav__icon md-icon"></span>
Linux Networking
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_networking/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_networking/dns/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
DNS
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_networking/udp/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
UDP
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_networking/http/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
HTTP
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_networking/tcp/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
TCP
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_networking/ipr/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Routing
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/linux_networking/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_2"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_2"
id="__nav_2_2_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Python and Web
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_2_2_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
Python and Web
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/python_web/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/python_web/python-concepts/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Some Python Concepts
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/python_web/python-web-flask/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Python, Web and Flask
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/python_web/url-shorten-app/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
The URL Shortening App
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/python_web/sre-conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_3"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_3"
id="__nav_2_3_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Data
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_2_3_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Data
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_3_1"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_3_1"
id="__nav_2_3_1_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Relational Databases
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="3"
aria-labelledby="__nav_2_3_1_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_3_1">
<span class="md-nav__icon md-icon"></span>
Relational Databases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/concepts/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Key Concepts
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/mysql/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
MySQL
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/innodb/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
InnoDB
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/backup_recovery/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Backup and Recovery
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/replication/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
MySQL Replication
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/operations/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Operational Concepts
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/select_query/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Select Query
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/query_performance/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Query Performance
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/lab/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Lab
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_sql/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_3_2"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_3_2"
id="__nav_2_3_2_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
NoSQL
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="3"
aria-labelledby="__nav_2_3_2_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_3_2">
<span class="md-nav__icon md-icon"></span>
NoSQL
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_nosql/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_nosql/key_concepts/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Key Concepts
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/databases_nosql/further_reading/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_3_3"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_3_3"
id="__nav_2_3_3_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Message Queue
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="3"
aria-labelledby="__nav_2_3_3_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_3_3">
<span class="md-nav__icon md-icon"></span>
Message Queue
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/messagequeue/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/messagequeue/key_concepts/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Key Concepts
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/messagequeue/further_reading/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_3_4"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_3_4"
id="__nav_2_3_4_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Big Data
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="3"
aria-labelledby="__nav_2_3_4_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_3_4">
<span class="md-nav__icon md-icon"></span>
Big Data
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/big_data/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/big_data/evolution/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Evolution and Architecture of Hadoop
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/big_data/tasks/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_4"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_4"
id="__nav_2_4_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Systems Design
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_2_4_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_4">
<span class="md-nav__icon md-icon"></span>
Systems Design
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/systems_design/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/systems_design/scalability/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Scalability
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/systems_design/availability/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Availability
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/systems_design/fault-tolerance/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Fault Tolerance
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/systems_design/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_5"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_5"
id="__nav_2_5_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Metrics and Monitoring
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_2_5_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_5">
<span class="md-nav__icon md-icon"></span>
Metrics and Monitoring
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/metrics_and_monitoring/introduction/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/metrics_and_monitoring/command-line_tools/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Command-line Tools
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/metrics_and_monitoring/third-party_monitoring/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Third-party Monitoring
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/metrics_and_monitoring/alerts/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Proactive Monitoring with Alerts
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/metrics_and_monitoring/best_practices/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Best Practices for Monitoring
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/metrics_and_monitoring/observability/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Observability
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/metrics_and_monitoring/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_2_6"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_2_6"
id="__nav_2_6_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Security
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_2_6_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_2_6">
<span class="md-nav__icon md-icon"></span>
Security
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/security/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/security/fundamentals/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Fundamentals of Security
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/security/network_security/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Network Security
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/security/threats_attacks_defences/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Threat, Attacks & Defences
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/security/writing_secure_code/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Writing Secure code
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../level101/security/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_3"
checked
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_3"
id="__nav_3_label"
tabindex=""
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Level 102
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="1"
aria-labelledby="__nav_3_label"
aria-expanded="true"
>
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Level 102
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_3_1"
checked
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_3_1"
id="__nav_3_1_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Linux Intermediate
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_3_1_label"
aria-expanded="true"
>
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Linux Intermediate
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../introduction/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../package_management/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Package Management
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../storage_media/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Storage Media
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../archiving_backup/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Archiving and Backup
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../introvim/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction to Vim
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item md-nav__item--active">
<!-- State toggle -->
<input
class="md-nav__toggle md-toggle"
type="checkbox"
id="__toc"
/>
<!-- Hack: see partials/toc.html for more information -->
<!-- Navigation link to table of contents -->
<label class="md-nav__link md-nav__link--active" for="__toc">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Bash Scripting
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<a
href="./"
class="md-nav__link md-nav__link--active"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Bash Scripting
</span>
<!-- Navigation link status -->
</a>
<!-- Table of contents -->
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#introduction" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#writing-the-first-bash-script" class="md-nav__link">
<span class="md-ellipsis">
Writing the first bash script:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#taking-user-input-and-working-with-variables" class="md-nav__link">
<span class="md-ellipsis">
Taking user input and working with variables:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exit-status" class="md-nav__link">
<span class="md-ellipsis">
Exit status:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#command-line-arguments-and-understanding-if-else-branching" class="md-nav__link">
<span class="md-ellipsis">
Command line arguments and understanding If … else branching:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#looping-over-to-do-a-repeated-task" class="md-nav__link">
<span class="md-ellipsis">
Looping over to do a repeated task.
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#function" class="md-nav__link">
<span class="md-ellipsis">
Function
</span>
</a>
</li>
</ul>
</nav>
</li>
<!-- Navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_3_2"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_3_2"
id="__nav_3_2_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Linux Advanced
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_3_2_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Linux Advanced
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_3_2_1"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_3_2_1"
id="__nav_3_2_1_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Containerization And Orchestration
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="3"
aria-labelledby="__nav_3_2_1_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_3_2_1">
<span class="md-nav__icon md-icon"></span>
Containerization And Orchestration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../containerization_and_orchestration/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../containerization_and_orchestration/intro_to_containers/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction To Containers
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../containerization_and_orchestration/containerization_with_docker/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Containerization With Docker
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../containerization_and_orchestration/orchestration_with_kubernetes/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Orchestration With Kubernetes
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../containerization_and_orchestration/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_3_2_2"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_3_2_2"
id="__nav_3_2_2_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
System Calls and Signals
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="3"
aria-labelledby="__nav_3_2_2_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_3_2_2">
<span class="md-nav__icon md-icon"></span>
System Calls and Signals
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_calls_and_signals/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_calls_and_signals/signals/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Signals
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_calls_and_signals/system_calls/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
System Calls
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_calls_and_signals/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_3_3"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_3_3"
id="__nav_3_3_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Networking
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_3_3_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Networking
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../networking/introduction/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../networking/security/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Security
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../networking/scale/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Scale
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../networking/rtt/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
RTT
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../networking/infrastructure-features/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Infrastructure Services
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../networking/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_3_4"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_3_4"
id="__nav_3_4_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
System Design
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_3_4_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_3_4">
<span class="md-nav__icon md-icon"></span>
System Design
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_design/intro/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_design/large-system-design/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Large System Design
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_design/scaling/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Scaling
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_design/scaling-beyond-the-datacenter/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Scaling Beyond the Data Center
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_design/resiliency/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Resiliency
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_design/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_3_5"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_3_5"
id="__nav_3_5_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
System Troubleshooting and Performance Improvements
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_3_5_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_3_5">
<span class="md-nav__icon md-icon"></span>
System Troubleshooting and Performance Improvements
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_troubleshooting_and_performance/introduction/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_troubleshooting_and_performance/troubleshooting/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Troubleshooting
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_troubleshooting_and_performance/important-tools/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Important Tools
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_troubleshooting_and_performance/performance-improvements/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Performance Improvements
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_troubleshooting_and_performance/troubleshooting-example/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Troubleshooting Example
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../system_troubleshooting_and_performance/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<!-- Determine all nested items that are index pages -->
<!-- Navigation tabs -->
<!-- Render 1st level items with nested items as sections -->
<!-- Navigation pruning -->
<!-- Nested navigation item -->
<li class="md-nav__item md-nav__item--nested">
<!-- Determine checked and indeterminate state -->
<!-- Active checkbox expands items contained within nested section -->
<input
class="md-nav__toggle md-toggle "
type="checkbox"
id="__nav_3_6"
/>
<!-- Toggle to expand nested items -->
<label
class="md-nav__link"
for="__nav_3_6"
id="__nav_3_6_label"
tabindex="0"
>
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Continuous Integration and Continuous Delivery
</span>
<!-- Navigation link status -->
<span class="md-nav__icon md-icon"></span>
</label>
<!-- Toggle to expand nested items with link to index page -->
<!-- Nested navigation -->
<nav
class="md-nav"
data-md-level="2"
aria-labelledby="__nav_3_6_label"
aria-expanded="false"
>
<label class="md-nav__title" for="__nav_3_6">
<span class="md-nav__icon md-icon"></span>
Continuous Integration and Continuous Delivery
</label>
<ul class="md-nav__list" data-md-scrollfix>
<!-- Nested navigation item -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../continuous_integration_and_continuous_delivery/introduction/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Introduction
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../continuous_integration_and_continuous_delivery/introduction_to_cicd/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
What is CI/CD?
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../continuous_integration_and_continuous_delivery/cicd_brief_history/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Brief History
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../continuous_integration_and_continuous_delivery/continuous_integration_build_pipeline/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Continuous Integration
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../continuous_integration_and_continuous_delivery/continuous_delivery_release_pipeline/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Continuous Delivery and Deployment
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../continuous_integration_and_continuous_delivery/jenkins_cicd_pipeline_hands_on_lab/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
CI/CD Pipeline - Hands-on
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../continuous_integration_and_continuous_delivery/conclusion/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Conclusion
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
</ul>
</nav>
<!-- Pruned navigation item -->
</li>
<!-- Currently active page -->
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../CONTRIBUTING/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Contribute
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../CODE_OF_CONDUCT/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
Code of Conduct
</span>
<!-- Navigation link status -->
</a>
</li>
<!-- Determine classes -->
<!-- Determine active page for paginated views -->
<!-- Navigation item with nested items -->
<li class="md-nav__item">
<a href="../../../sre_community/" class="md-nav__link">
<!-- Navigation link icon -->
<!-- Navigation link title -->
<span class="md-ellipsis">
SRE Community
</span>
<!-- Navigation link status -->
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#introduction" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#writing-the-first-bash-script" class="md-nav__link">
<span class="md-ellipsis">
Writing the first bash script:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#taking-user-input-and-working-with-variables" class="md-nav__link">
<span class="md-ellipsis">
Taking user input and working with variables:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exit-status" class="md-nav__link">
<span class="md-ellipsis">
Exit status:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#command-line-arguments-and-understanding-if-else-branching" class="md-nav__link">
<span class="md-ellipsis">
Command line arguments and understanding If … else branching:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#looping-over-to-do-a-repeated-task" class="md-nav__link">
<span class="md-ellipsis">
Looping over to do a repeated task.
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#function" class="md-nav__link">
<span class="md-ellipsis">
Function
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="bash-scripting">Bash Scripting</h1>
<h2 id="introduction">Introduction</h2>
<p>As an SRE, the Linux system sits at the core of our day to day work and so is bash scripting. Its a scripting language that is run by Linux Bash Interpreter. Until now we have covered a lot of features mostly on a command line, now we will use this command line as an interpreter to write programs that will ease our day to day job as an SRE.</p>
<h2 id="writing-the-first-bash-script">Writing the first bash script:</h2>
<p>We will start with a simple program, we will use Vim as the editor during the whole journey.</p>
<pre><code>#!/bin/bash
# This if my first bash script
# Line starting with # is commented
echo &quot;Hello world!&quot;
</code></pre>
<p>The first line of the script starting with “#!” is called she-bang. This is simply to let the system which interpreter to use while executing the script.</p>
<p>Any Line starting with “#” (other than #!) is referred to as comments in script and is ignored by the interpreter while executing the script. Line 6 shows the “echo” command that we would be running.</p>
<p>We will save this script as “firstscript.sh” and make the script executable using <code>chmod</code>.</p>
<p><img alt="" src="../images/image16.png" /></p>
<p>Next thing is to run the script with the explicit path. We can see the desired “Hello World!” as output.</p>
<h2 id="taking-user-input-and-working-with-variables">Taking user input and working with variables:</h2>
<p>Taking standard input using the <code>read</code> command and working with variables in bash.</p>
<pre><code>#!/bin/bash
#We will take standard input
#Will list all files at the path
#We will concate variable and string
echo &quot;Enter the path&quot;
read path
echo &quot;How deep in directory you want to go:&quot;
read depth
echo &quot;All files at path &quot; $path
du -d $depth -all -h $path
</code></pre>
<p>We are reading path in variable “<em>path</em>” and variable “<em>depth</em>” to list files and directories up to that depth. We concatenated strings with variables. We always use <code>$</code> (dollar-sign) to reference the value it contains.</p>
<p><img alt="" src="../images/image28.png" /></p>
<p>We pass these variables to the <code>du</code> command to list out all the files and directories in that path upto the desired depth.</p>
<h2 id="exit-status">Exit status:</h2>
<p>Every command and script when it completes executing, returns an integer in the range from 0 to 255 to the system, this is called exit status. “0” denotes success of the command while non-zero return code usually indicates various kinds of errors.</p>
<p><img alt="" src="../images/image6.png" /></p>
<p>We use <code>$?</code> special shell variable to get exit status of the last executed script or command.</p>
<h2 id="command-line-arguments-and-understanding-if-else-branching">Command line arguments and understanding If … else branching:</h2>
<p>Another way to pass some values to the script is using command line arguments. Usually command line arguments in bash are accessed by $ followed by the index. The 0th index refers to the file itself, <code>$1</code> to the first argument and so on. We use <code>$#</code> to check the count of arguments passed to the script.</p>
<p>Making decisions in the programming language is its integral part, and to tackle different conditions we use if … else statements or some more nested variant of it.</p>
<p>The below script uses multiple concepts in one script. The aim of the script is to get some properties of the file.</p>
<p>Line 4 to 7 is the standard example of "if statement" in bash. Syntax is as explained below:</p>
<pre><code>If [ condition ]; then
If_block_to_execute
else
else_block_to_execute
fi
</code></pre>
<p>fi is to close the if … else block. We are comparing count of argument($#) if it is equal to 1 or not. If not we prompt for only one argument and exit the script with status code 1(not a success). One or more if statements can exist without else statement but vice versa doesnt make any sense.</p>
<p>Operator -ne is used to compare two integers, read as “integer1 <em>not equal to</em> integer 2”. Other comparison operators are:</p>
<table>
<thead>
<tr>
<th>Operations</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>num1 -eq num2</strong></td>
<td>check if 1st number is equal to 2nd number</td>
</tr>
<tr>
<td><strong>num1 -ge num2</strong></td>
<td>checks if 1st number is greater than or equal to 2nd number</td>
</tr>
<tr>
<td><strong>num1 -gt num2</strong></td>
<td>checks if 1st number is greater than 2nd number</td>
</tr>
<tr>
<td><strong>num1 -le num2</strong></td>
<td>checks if 1st number is less than or equal to 2nd number</td>
</tr>
<tr>
<td><strong>num1 -lt num2</strong></td>
<td>checks if 1st number is less than 2nd number</td>
</tr>
</tbody>
</table>
<pre><code>#!/bin/bash
# This script evaluate the status of a file
if [ $# -ne 1 ]; then
echo &quot;Please pass one file name as argument&quot;
exit 1
fi
FILE=$1
if [ -e &quot;$FILE&quot; ]; then
if [ -f &quot;$FILE&quot; ]; then
echo &quot;$FILE is a regular file.&quot;
fi
if [ -d &quot;$FILE&quot; ]; then
echo &quot;$FILE is a directory.&quot;
fi
if [ -r &quot;$FILE&quot; ]; then
echo &quot;$FILE is readable.&quot;
fi
if [ -w &quot;$FILE&quot; ]; then
echo &quot;$FILE is writable.&quot;
fi
if [ -x &quot;$FILE&quot; ]; then
echo &quot;$FILE is executable/searchable.&quot;
fi
else
echo &quot;$FILE does not exist&quot;
exit 2
fi
exit 0
</code></pre>
<p>There are lots of file expressions to evaluate file,like in bash script “-e” in line 10 returns true if the file passed as argument exist, false otherwise. Below are the some widely used file expressions:</p>
<table>
<thead>
<tr>
<th>File Operations</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>-e file</strong></td>
<td>File exists</td>
</tr>
<tr>
<td><strong>-d file</strong></td>
<td>File exists and is directory</td>
</tr>
<tr>
<td><strong>-f file</strong></td>
<td>File exists and is regular file</td>
</tr>
<tr>
<td><strong>-L file</strong></td>
<td>File exists and is symbolic link</td>
</tr>
<tr>
<td><strong>-r file</strong></td>
<td>File exists and has readable permission</td>
</tr>
<tr>
<td><strong>-w file</strong></td>
<td>File exists and has writable permission</td>
</tr>
<tr>
<td><strong>-x file</strong></td>
<td>File exists and has executable permission</td>
</tr>
<tr>
<td><strong>-s file</strong></td>
<td>File exists and size is greater than zero</td>
</tr>
<tr>
<td><strong>-S file</strong></td>
<td>File exists and is a network socket.</td>
</tr>
</tbody>
</table>
<p><img alt="" src="../images/image17.png" /></p>
<p>Exit status is 2 when the file is not found. And if the file is found it prints out the properties it holds with exit status 0(success).</p>
<h2 id="looping-over-to-do-a-repeated-task">Looping over to do a repeated task.</h2>
<p>We usually come up with tasks that are mostly repetitive, looping helps us to code those repetitive tasks in a more formal manner. There are different types of loop statement we can use in bash:</p>
<table>
<thead>
<tr>
<th>Loop</th>
<th>Syntax</th>
</tr>
</thead>
<tbody>
<tr>
<td>while</td>
<td>while [ expression ]<br><br>do <br><br>    [ while_block_to_execute ]<br><br>done</td>
</tr>
<tr>
<td>for</td>
<td>for variable in 1,2,3 .. n<br><br>do <br><br>    [ for_block_to_execute ]<br><br>done</td>
</tr>
<tr>
<td>until</td>
<td>until [ expression ] <br><br>do <br><br>    [ until_block_to_execute ]<br><br>done</td>
</tr>
</tbody>
</table>
<pre><code>#!/bin/bash
#Script to monitor the server
hosts=`cat host_list`
while true
do
for i in $hosts
do
h=&quot;$i&quot;
ping -c 1 -q &quot;$h&quot; &amp;&gt;/dev/null
if [ $? -eq 0 ]
then
echo `date` &quot;server $h alive&quot;
else
echo `date` &quot;server $h is dead&quot;
fi
done
sleep 60
done
</code></pre>
<p>Monitoring a server is an important part of being an SRE. The file “host_list” contains the list of host which we want to monitor.</p>
<p>We used an infinite “while” loop that will sleep every 60seconds. And for each host in the host_list we want to ping that host and check if that ping was successful with its exit status, if its successful we say server is live or its dead.</p>
<p><img alt="" src="../images/image13.png" /></p>
<p>The output of the script shows it is running every minute with the timestamp.</p>
<h2 id="function">Function</h2>
<p>Developers always try to make their applications/programs in modular fashion so that they dont have to write the same code every time and everywhere to carry out similar tasks. Functions help us achieve this.</p>
<p>We usually call functions with some arguments and expect result based on that argument.</p>
<p>The backup process we discussed in earlier section, we will try to automate that process using the below script and also get familiar with some more concepts like string comparison, functions and logical AND and OR operations.</p>
<p>In the below code “log_backup” is a function which wont be executed until it is called.</p>
<p>Line37 will be executed first where we will check the no. of arguments passed to the script.</p>
<p>There are many logical operators like AND,OR, XOR etc.</p>
<table>
<thead>
<tr>
<th>Logical Operator</th>
<th>Symbol</th>
</tr>
</thead>
<tbody>
<tr>
<td>AND</td>
<td>&amp;&amp;</td>
</tr>
<tr>
<td>OR</td>
<td>|</td>
</tr>
<tr>
<td>NOT</td>
<td>!</td>
</tr>
</tbody>
</table>
<p>Passing the wrong argument to script “backup.sh” will prompt for correct usage. We have to pass whether we want to have incremental backup of the directory or the full backup along with the path of the directory we want to backup. If we want the incremental backup we will an additional argument as a meta file which is used to store the information of previous backed up files.(usually a metafile is .snar extension).</p>
<pre><code>#!/bin/bash
#Scripts to take incremental and full backup
backup_dir=&quot;/mnt/backup/&quot;
time_stamp=&quot;`date +%d-%m-%Y-%Hh-%Mm-%Ss`&quot;
log_backup(){
if [ $# -lt 2 ]; then
echo &quot;Usage: ./backup.sh [backup_type] [log_path]&quot;
exit 1;
fi
if [ $1 == &quot;incremental&quot; ]; then
if [ $# -ne 3 ]; then
echo &quot;Usage: ./backup.sh [backup_type] [log_path] [meta_file]&quot;
exit 3;
fi
tar --create --listed-incremental=$3 --verbose --verbose --file=&quot;${backup_dir}incremental-${time_stamp}.tar&quot; $2
if [ $? -eq 0 ]; then
echo &quot;Incremental backup succesful at '${backup_dir}incremental-${time_stamp}.tar'&quot;
else
echo &quot;Incremental Backup Failure&quot;
fi
elif [ $1 == &quot;full&quot; ];then
tar cf &quot;${backup_dir}fullbackup-${time_stamp}.tar&quot; $2
if [ $? -eq 0 ];then
echo &quot;Full backup successful at '${backup_dir}fullbackup-${time_stamp}.tar'&quot;
else
echo &quot;Full Backup Failure&quot;
fi
else
echo &quot;Unknown parameter passed&quot;
echo &quot;Usage: ./backup.sh [incremental|full] [log_path]&quot;
exit 2;
fi
}
if [ $# -lt 2 ] || [ $# -gt 3 ];then
echo &quot;Usage: ./backup.sh [incremental|full] [log_path]&quot;
exit 1
elif [ $# -eq 2 ];then
log_backup $1 $2
elif [ $# -eq 3 ];then
log_backup $1 $2 $3
fi
exit 0
</code></pre>
<p>Passing all 3 arguments for incremental backup will take incremental backup at “/mnt/backup/” with each archive having timestamp concatenated to each file.</p>
<p><img alt="" src="../images/image20.png" /></p>
<p>The arguments passed inside the function can be accessed via <code>$</code> followed by the index. The 0th index refers to the function itself,</p>
<p><code>$1</code> to the first argument and so on. We use <code>#$</code> to check the count of arguments passed to the function.</p>
<p>Once we pass the string “incremental” or “full” it gets compared inside the function and the specific block is executed. Below are some more operations that can be performed over strings.</p>
<table>
<thead>
<tr>
<th>String Operations</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>string1 == string2</td>
<td>Returns true if string1 equals string 2 otherwise false.</td>
</tr>
<tr>
<td>string1 != string2</td>
<td>Returns true if string NOT equal string 2 otherwise false.</td>
</tr>
<tr>
<td>string1 ~= regex</td>
<td>Returns true if string1 matches the extended regular expression.</td>
</tr>
<tr>
<td>-z string</td>
<td>Returns true if string length is zero otherwise false.</td>
</tr>
<tr>
<td>-n string</td>
<td>Returns true if string length is non-zero otherwise false.</td>
</tr>
</tbody>
</table>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright 2020 LinkedIn Corporation. All Rights Reserved. Licensed under the Creative Commons Attribution 4.0 International Public License
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://github.com/linkedin/school-of-sre" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.sections"], "search": "../../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.c8d2eff1.min.js"></script>
</body>
</html>