mirror of
https://github.com/rawiriblundell/wiki.bash-hackers.org
synced 2024-11-02 00:53:07 +01:00
593 lines
38 KiB
Plaintext
593 lines
38 KiB
Plaintext
<!DOCTYPE html>
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr" class="no-js">
|
|
<head><script type="text/javascript" src="/_static/js/bundle-playback.js?v=TPXmWR5s" charset="utf-8"></script>
|
|
<script type="text/javascript" src="/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script>
|
|
<script type="text/javascript">
|
|
__wm.init("http://web.archive.org/web");
|
|
__wm.wombat("https://wiki.bash-hackers.org/syntax/basicgrammar?do=edit","20221003082936","http://web.archive.org/","web","/_static/",
|
|
"1664785776");
|
|
</script>
|
|
<link rel="stylesheet" type="text/css" href="/_static/css/banner-styles.css?v=S1zqJCYt" />
|
|
<link rel="stylesheet" type="text/css" href="/_static/css/iconochive.css?v=qtvMKcIJ" />
|
|
<!-- End Wayback Rewrite JS Include -->
|
|
|
|
<meta charset="UTF-8"/>
|
|
<title>Basic grammar rules of Bash [Bash Hackers Wiki]</title>
|
|
<script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
|
|
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
|
<link rel="shortcut icon" href="/web/20221003082936im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/favicon.ico"/>
|
|
<link rel="apple-touch-icon" href="/web/20221003082936im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/apple-touch-icon.png"/>
|
|
<meta name="generator" content="DokuWiki"/>
|
|
<meta name="robots" content="noindex,nofollow"/>
|
|
<link type="text/css" rel="stylesheet" href="/web/20221003082936cs_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/bootstrap/default/bootstrap.min.css"/>
|
|
<link rel="search" type="application/opensearchdescription+xml" href="/web/20221003082936/https://wiki.bash-hackers.org/lib/exe/opensearch.php" title="Bash Hackers Wiki"/>
|
|
<link rel="start" href="/"/>
|
|
<link rel="contents" href="/syntax/basicgrammar?do=index" title="Sitemap"/>
|
|
<link rel="manifest" href="/web/20221003082936/https://wiki.bash-hackers.org/lib/exe/manifest.php"/>
|
|
<link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/web/20221003082936/https://wiki.bash-hackers.org/feed.php"/>
|
|
<link rel="alternate" type="application/rss+xml" title="Current namespace" href="/web/20221003082936/https://wiki.bash-hackers.org/feed.php?mode=list&ns=syntax"/>
|
|
<link rel="alternate" type="text/html" title="Plain HTML" href="/web/20221003082936/https://wiki.bash-hackers.org/_export/xhtml/syntax/basicgrammar"/>
|
|
<link rel="alternate" type="text/plain" title="Wiki Markup" href="/web/20221003082936/https://wiki.bash-hackers.org/_export/raw/syntax/basicgrammar"/>
|
|
<link rel="stylesheet" type="text/css" href="/web/20221003082936cs_/https://wiki.bash-hackers.org/lib/exe/css.php?t=bootstrap3&tseed=54923c3deda180f2db5bd755cd8fbf1a"/>
|
|
<!--[if gte IE 9]><!-->
|
|
<script type="text/javascript">/*<![CDATA[*/var NS='syntax';var JSINFO = {"updatable":1,"userreplace":1,"default_macro_string":"","plugins":{"edittable":{"default columnwidth":""}},"move_renameokay":false,"isadmin":0,"isauth":0,"bootstrap3":{"mode":"source","toc":[],"config":{"collapsibleSections":0,"fixedTopNavbar":1,"showSemanticPopup":0,"sidebarOnNavbar":0,"tagsOnTop":1,"tocAffix":1,"tocCollapseOnScroll":1,"tocCollapsed":0,"tocLayout":"default","useAnchorJS":1,"useAlternativeToolbarIcons":1}},"id":"syntax:basicgrammar","namespace":"syntax","ACT":"source","useHeadingNavigation":1,"useHeadingContent":1};
|
|
/*!]]>*/</script>
|
|
<script type="text/javascript" charset="utf-8" src="/web/20221003082936js_/https://wiki.bash-hackers.org/lib/exe/jquery.php?tseed=23f888679b4f1dc26eef34902aca964f"></script>
|
|
<script type="text/javascript" charset="utf-8" src="/web/20221003082936js_/https://wiki.bash-hackers.org/lib/exe/js.php?t=bootstrap3&tseed=54923c3deda180f2db5bd755cd8fbf1a"></script>
|
|
<script type="text/javascript">/*<![CDATA[*/if (typeof IconifyConfig == 'undefined') { var IconifyConfig = { 'defaultAPI' : '/lib/tpl/bootstrap3/iconify.php?prefix={prefix}&icons={icons}' } }
|
|
/*!]]>*/</script>
|
|
<script type="text/javascript" src="/web/20221003082936js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/bootstrap/js/bootstrap.min.js"></script>
|
|
<script type="text/javascript" src="/web/20221003082936js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/anchorjs/anchor.min.js"></script>
|
|
<script type="text/javascript" src="/web/20221003082936js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/typeahead/bootstrap3-typeahead.min.js"></script>
|
|
<script type="text/javascript" src="/web/20221003082936js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/iconify/iconify.min.js"></script>
|
|
<script type="text/javascript" src="/web/20221003082936js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/iconify/plugins/fa.js"></script>
|
|
<!--<![endif]-->
|
|
<style type="text/css">@media screen { body { margin-top: 65px; } #dw__toc.affix { top: 55px; position: fixed !important; } #dw__toc .nav .nav .nav { display: none; } }</style>
|
|
<!--[if lt IE 9]>
|
|
<script type="text/javascript" src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
|
<script type="text/javascript" src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
|
<![endif]-->
|
|
</head>
|
|
<body class="default dokuwiki mode_source tpl_bootstrap3 dw-page-on-panel dw-fluid-container" data-page-id="syntax:basicgrammar"><div class="dokuwiki">
|
|
<header id="dokuwiki__header" class="dw-container dokuwiki container-fluid mx-5">
|
|
<!-- navbar -->
|
|
<nav id="dw__navbar" class="navbar navbar-fixed-top navbar-default" role="navigation">
|
|
|
|
<div class="dw-container container-fluid mx-5">
|
|
|
|
<div class="navbar-header">
|
|
|
|
<button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".navbar-collapse">
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
</button>
|
|
|
|
<a class="navbar-brand d-flex align-items-center" href="/web/20221003082936/https://wiki.bash-hackers.org/start" accesskey="h" title="Bash Hackers Wiki"><img id="dw__logo" class="pull-left h-100 mr-4" alt="Bash Hackers Wiki" src="/web/20221003082936im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/logo.png"/><div class="pull-right"><div id="dw__title">Bash Hackers Wiki</div></div></a>
|
|
</div>
|
|
|
|
<div class="collapse navbar-collapse">
|
|
|
|
|
|
|
|
|
|
<div class="navbar-right" id="dw__navbar_items">
|
|
|
|
|
|
<!-- navbar-searchform -->
|
|
<form action="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar" accept-charset="utf-8" class="navbar-form navbar-left search" id="dw__search" method="get" role="search">
|
|
<div class="input-group">
|
|
<input id="qsearch" autocomplete="off" type="search" placeholder="Search" value="" accesskey="f" name="q" class="form-control" title="[F]"/>
|
|
<div class="input-group-btn">
|
|
<button class="btn btn-default" type="submit" title="Search">
|
|
<span class="iconify" data-icon="mdi:magnify"></span> </button>
|
|
</div>
|
|
|
|
</div>
|
|
<input type="hidden" name="do" value="search"/>
|
|
</form>
|
|
<!-- /navbar-searchform -->
|
|
<!-- tools-menu -->
|
|
<ul class="nav navbar-nav dw-action-icon" id="dw__tools">
|
|
|
|
|
|
<li class="dropdown">
|
|
|
|
<a href="" class="dropdown-toggle" data-target="#" data-toggle="dropdown" title="" role="button" aria-haspopup="true" aria-expanded="false">
|
|
<span class="iconify" data-icon="mdi:wrench"></span> <span class="hidden-lg hidden-md hidden-sm">Tools</span> <span class="caret"></span>
|
|
</a>
|
|
|
|
<ul class="dropdown-menu tools" role="menu">
|
|
|
|
<li class="dropdown-header">
|
|
<span class="iconify" data-icon="mdi:account"></span> User Tools </li>
|
|
|
|
<li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=register" title="Register" rel="nofollow" class="menuitem register"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M15 14c-2.67 0-8 1.33-8 4v2h16v-2c0-2.67-5.33-4-8-4m-9-4V7H4v3H1v2h3v3h2v-3h3v-2m6 2a4 4 0 0 0 4-4 4 4 0 0 0-4-4 4 4 0 0 0-4 4 4 4 0 0 0 4 4z"/></svg><span>Register</span></a></li><li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=login&sectok=" title="Log In" rel="nofollow" class="menuitem login"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M10 17.25V14H3v-4h7V6.75L15.25 12 10 17.25M8 2h9a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-4h2v4h9V4H8v4H6V4a2 2 0 0 1 2-2z"/></svg><span>Log In</span></a></li>
|
|
<li class="divider" role="separator"></li>
|
|
|
|
|
|
<li class="dropdown-header">
|
|
<span class="iconify" data-icon="mdi:toolbox"></span> Site Tools </li>
|
|
|
|
<li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=recent" title="Recent Changes [r]" rel="nofollow" accesskey="r" class="menuitem recent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M15 13h1.5v2.82l2.44 1.41-.75 1.3L15 16.69V13m4-5H5v11h4.67c-.43-.91-.67-1.93-.67-3a7 7 0 0 1 7-7c1.07 0 2.09.24 3 .67V8M5 21a2 2 0 0 1-2-2V5c0-1.11.89-2 2-2h1V1h2v2h8V1h2v2h1a2 2 0 0 1 2 2v6.1c1.24 1.26 2 2.99 2 4.9a7 7 0 0 1-7 7c-1.91 0-3.64-.76-4.9-2H5m11-9.85A4.85 4.85 0 0 0 11.15 16c0 2.68 2.17 4.85 4.85 4.85A4.85 4.85 0 0 0 20.85 16c0-2.68-2.17-4.85-4.85-4.85z"/></svg><span>Recent Changes</span></a></li><li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=media&ns=syntax" title="Media Manager" rel="nofollow" class="menuitem media"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M7 15l4.5-6 3.5 4.5 2.5-3L21 15m1-11h-8l-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M2 6H0v14a2 2 0 0 0 2 2h18v-2H2V6z"/></svg><span>Media Manager</span></a></li><li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=index" title="Sitemap [x]" rel="nofollow" accesskey="x" class="menuitem index"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M3 3h6v4H3V3m12 7h6v4h-6v-4m0 7h6v4h-6v-4m-2-4H7v5h6v2H5V9h2v2h6v2z"/></svg><span>Sitemap</span></a></li>
|
|
<li class="divider" role="separator"></li>
|
|
|
|
|
|
<li class="dropdown-header">
|
|
<span class="iconify" data-icon="mdi:file-document-outline"></span> Page Tools </li>
|
|
|
|
<li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=" title="Show page [v]" rel="nofollow" accesskey="v" class="menuitem show"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m9 16v-2H6v2h9m3-4v-2H6v2h12z"/></svg><span>Show page</span></a></li><li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=revisions" title="Old revisions [o]" rel="nofollow" accesskey="o" class="menuitem revs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z"/></svg><span>Old revisions</span></a></li><li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=backlink" title="Backlinks" rel="nofollow" class="menuitem backlink"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M10.59 13.41c.41.39.41 1.03 0 1.42-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0 5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24 2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0 5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24 2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24.973.973 0 0 1 0-1.42z"/></svg><span>Backlinks</span></a></li><li class="action"><a href="#dokuwiki__top" title="Back to top [t]" rel="nofollow" accesskey="t" class="menuitem top"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"/></svg><span>Back to top</span></a></li>
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
<!-- /tools-menu -->
|
|
|
|
<ul class="nav navbar-nav">
|
|
|
|
|
|
<li>
|
|
<span class="dw__actions dw-action-icon">
|
|
<a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=register" title="Register" rel="nofollow" class="menuitem register btn btn-success navbar-btn"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M15 14c-2.67 0-8 1.33-8 4v2h16v-2c0-2.67-5.33-4-8-4m-9-4V7H4v3H1v2h3v3h2v-3h3v-2m6 2a4 4 0 0 0 4-4 4 4 0 0 0-4-4 4 4 0 0 0-4 4 4 4 0 0 0 4 4z"/></svg><span class=""> Register</span></a><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=login&sectok=" title="Log In" rel="nofollow" class="menuitem login btn btn-default navbar-btn"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M10 17.25V14H3v-4h7V6.75L15.25 12 10 17.25M8 2h9a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-4h2v4h9V4H8v4H6V4a2 2 0 0 1 2-2z"/></svg><span class=""> Log In</span></a> </span>
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<!-- navbar -->
|
|
<div align="center">
|
|
<script async src="//web.archive.org/web/20221003082936js_/https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
|
|
<!-- BHORG_BOTTOM -->
|
|
<ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-4658830517838678" data-ad-slot="1603598940"></ins>
|
|
<script>
|
|
(adsbygoogle = window.adsbygoogle || []).push({});
|
|
</script>
|
|
</div>
|
|
|
|
</header>
|
|
|
|
<a name="dokuwiki__top" id="dokuwiki__top"></a>
|
|
|
|
<main role="main" class="dw-container pb-5 dokuwiki container-fluid mx-5">
|
|
|
|
<div id="dokuwiki__pageheader">
|
|
|
|
|
|
<!-- breadcrumbs -->
|
|
<nav id="dw__breadcrumbs" class="small">
|
|
|
|
<hr/>
|
|
|
|
<div class="dw__youarehere">
|
|
<ol class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li>You are here</li><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="/web/20221003082936/https://wiki.bash-hackers.org/start" itemprop="item" title="start"><span itemprop="name"><span class="iconify" data-icon="mdi:home"></span></span></a></li><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a itemprop="item" href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/start" class="wikilink1" title="syntax:start">Syntax</a></li><li class="active" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name"><a itemprop="item" href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar" class="wikilink1" title="syntax:basicgrammar">Basic grammar rules of Bash</a></span></li></ol> </div>
|
|
|
|
<div class="dw__breadcrumbs hidden-print">
|
|
<ol class="breadcrumb"><li>Trace</li> </div>
|
|
|
|
<hr/>
|
|
|
|
</nav>
|
|
<!-- /breadcrumbs -->
|
|
|
|
<p class="text-right">
|
|
<span class="pageId ml-1 label label-primary">syntax:basicgrammar</span> </p>
|
|
|
|
<div id="dw__msgarea" class="small">
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="row">
|
|
|
|
|
|
<article id="dokuwiki__content" class="col-sm-12 col-md-12 " itemscope itemtype="http://schema.org/Article" itemref="dw__license">
|
|
|
|
|
|
<!-- page-tools -->
|
|
<nav id="dw__pagetools" class="hidden-print">
|
|
<div class="tools panel panel-default">
|
|
<ul class="nav nav-stacked nav-pills text-muted">
|
|
<li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=" title="Show page [v]" rel="nofollow" accesskey="v" class="menuitem show"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m9 16v-2H6v2h9m3-4v-2H6v2h12z"/></svg><span>Show page</span></a></li><li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=revisions" title="Old revisions [o]" rel="nofollow" accesskey="o" class="menuitem revs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z"/></svg><span>Old revisions</span></a></li><li class="action"><a href="/web/20221003082936/https://wiki.bash-hackers.org/syntax/basicgrammar?do=backlink" title="Backlinks" rel="nofollow" class="menuitem backlink"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M10.59 13.41c.41.39.41 1.03 0 1.42-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0 5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24 2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0 5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24 2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24.973.973 0 0 1 0-1.42z"/></svg><span>Backlinks</span></a></li><li class="action"><a href="#dokuwiki__top" title="Back to top [t]" rel="nofollow" accesskey="t" class="menuitem top"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"/></svg><span>Back to top</span></a></li> </ul>
|
|
</div>
|
|
</nav>
|
|
<!-- /page-tools -->
|
|
|
|
<div class="panel panel-default px-3 py-2" itemprop="articleBody">
|
|
<div class="page panel-body">
|
|
|
|
|
|
<div class="dw-content-page "><!-- content --><div class="dw-content"><p>
|
|
This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong.
|
|
</p>
|
|
<div class="editBox" role="application">
|
|
|
|
<div class="toolbar group">
|
|
<div id="draft__status" class="draft__status"></div>
|
|
<div id="tool__bar" class="tool__bar"></div>
|
|
</div>
|
|
<form id="dw__editform" method="post" action="" accept-charset="utf-8" class=" form-inline"><div class="no">
|
|
<input type="hidden" name="sectok" value=""/><input type="hidden" name="id" value="syntax:basicgrammar"/><input type="hidden" name="rev" value="0"/><input type="hidden" name="date" value="0"/><input type="hidden" name="prefix" value="."/><input type="hidden" name="suffix" value=""/><input type="hidden" name="changecheck" value="b73299e7b979008ef7dd60101f2fc932"/><input type="hidden" name="target" value="section"/><textarea name="wikitext" id="wiki__text" dir="auto" class="edit form-control" cols="80" rows="10" tabindex="1" readonly="readonly">
|
|
====== Basic grammar rules of Bash ======
|
|
|
|
{{keywords>bash shell scripting grammar syntax language}}
|
|
|
|
Bash builds its features on top of a few basic **grammar rules**. The code you see everywhere, the code you use, is based on those rules. However, **this is a very theoretical view**, but if you're interested, it may help you understand why things look the way they look.
|
|
|
|
If you don't know the commands used in the following examples, just trust the explanation.
|
|
|
|
===== Simple Commands =====
|
|
Bash manual says:
|
|
<code>
|
|
A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections,
|
|
and terminated by a control operator. The first word specifies the command to be executed, and is passed as argument
|
|
zero. The remaining words are passed as arguments to the invoked command.
|
|
</code>
|
|
|
|
Sounds harder than it actually is. It is what you do daily. You enter simple commands with parameters, and the shell executes them.
|
|
|
|
Every complex Bash operation can be split into simple commands:
|
|
<code>
|
|
ls
|
|
ls > list.txt
|
|
ls -l
|
|
LC_ALL=C ls
|
|
</code>
|
|
|
|
The last one might not be familiar. That one simply adds "''LC_ALL=C''" to the environment of the ''ls'' program. It doesn't affect your current shell. This also works while calling functions, unless Bash runs in POSIX(r) mode (in which case it affects your current shell).
|
|
|
|
Every command has an exit code. It's a type of return status. The shell can catch it and act on it. Exit code range is from 0 to 255, where 0 means success, and the rest mean either something failed, or there is an issue to report back to the calling program.
|
|
|
|
<wrap center round info 90%>
|
|
The simple command construct is the **base** for all higher constructs. Everything you execute, from pipelines to functions, finally ends up in (many) simple commands. That's why Bash only has one method to [[syntax:grammar:parser_exec | expand and execute a simple command]].
|
|
</wrap>
|
|
|
|
|
|
===== Pipelines =====
|
|
FIXME Missing an additional article about pipelines and pipelining
|
|
|
|
''[time [-p]] [ ! ] command [ | command2 ... ]''
|
|
|
|
**Don't get confused** about the name "pipeline." It's a grammatic name for a construct. Such a pipeline isn't necessarily a pair of commands where stdout/stdin is connected via a real pipe.
|
|
|
|
Pipelines are one or more [[basicgrammar##simple_commands | simple commands]] (separated by the ''|'' symbol connects their input and output), for example:
|
|
<code>ls /etc | wc -l</code>
|
|
will execute ''ls'' on ''/etc'' and **pipe** the output to ''wc'', which will count the lines generated by the ls command. The result is the number of directory entries in /etc.
|
|
|
|
The last command in the pipeline will set the exit code for the pipeline. This exit code can be "inverted" by prefixing an exclamation mark to the pipeline: An unsuccessful pipeline will exit "successful" and vice versa.
|
|
In this example, the commands in the if stanza will be executed if the pattern "^root:" is **not** found in ''/etc/passwd'':
|
|
<code>
|
|
if ! grep '^root:' /etc/passwd; then
|
|
echo "No root user defined... eh?"
|
|
fi
|
|
</code>
|
|
Yes, this is also a pipeline (although there is no pipe!), because the **exclamation mark to invert the exit code** can only be used in a pipeline.
|
|
If ''grep'''s exit code is 1 (FALSE) (the text was not found), the leading ''!'' will "invert" the exit code, and the shell sees (and acts on) exit code 0 (TRUE) and the ''then'' part of the ''if'' stanza is executed. One could say we checked for "''not grep "^root" /etc/passwd''".
|
|
|
|
The [[commands:builtin:set#attributes | set option pipefail]] determines the behavior of how bash reports the exit code of a pipeline. If it's set, then the exit code (''$?'') is the last command that exits with non zero status, if none fail, it's zero. If it's not set, then ''$?'' always holds the exit code of the last command (as explained above).
|
|
|
|
The shell option ''[[internals:shell_options#lastpipe | lastpipe]]'' will execute the last element in a pipeline construct in the current shell environment, i.e. not a subshell.
|
|
|
|
There's also an array ''PIPESTATUS[]'' that is set after a foreground pipeline is executed. Each element of ''PIPESTATUS[]'' reports the exit code of the respective command in the pipeline. Note: (1) it's only for foreground pipe and (2) for higher level structure that is built up from a pipeline. Like list, ''PIPESTATUS[]'' holds the exit status of the last pipeline command executed.
|
|
|
|
Another thing you can do with pipelines is log their execution time. Note that **''time'' is not a command**, it is part of the pipeline syntax:
|
|
<code>
|
|
# time updatedb
|
|
real 3m21.288s
|
|
user 0m3.114s
|
|
sys 0m4.744s
|
|
</code>
|
|
|
|
|
|
===== Lists =====
|
|
FIXME Missing an additional article about list operators
|
|
|
|
A list is a sequence of one or more [[basicgrammar#pipelines | pipelines]] separated by one of the operators '';'', ''&'', ''&&'', or ''││'', and optionally terminated by one of '';'', ''&'', or ''<newline>''.
|
|
|
|
=> It's a group of **pipelines** separated or terminated by **tokens** that all have **different meanings** for Bash.
|
|
|
|
Your whole Bash script technically is one big single list!
|
|
|
|
^Operator^Description^
|
|
|''<PIPELINE1> **<newline>** <PIPELINE2>''|Newlines completely separate pipelines. The next pipeline is executed without any checks. (You enter a command and press ''<RETURN>''!)|
|
|
|''<PIPELINE1> **;** <PIPELINE2>''|The semicolon does what ''<newline>'' does: It separates the pipelines|
|
|
|''<PIPELINE> **&** <PIPELINE>''|The pipeline in front of the ''&'' is executed **asynchronously** ("in the background"). If a pipeline follows this, it is executed immediately after the async pipeline starts|
|
|
|''<PIPELINE1> **&&** <PIPELINE2>''|''<PIPELINE1>'' is executed and **only** if its exit code was 0 (TRUE), then ''<PIPELINE2>'' is executed (AND-List)|
|
|
|''<PIPELINE1> **<nowiki>||</nowiki>** <PIPELINE2>''|''<PIPELINE1>'' is executed and **only** if its exit code was **not** 0 (FALSE), then ''<PIPELINE2>'' is executed (OR-List)|
|
|
|
|
**Note:** POSIX calls this construct a "compound lists".
|
|
|
|
===== Compound Commands =====
|
|
|
|
See also the [[syntax:ccmd:intro | list of compound commands]].
|
|
|
|
There are two forms of compound commands:
|
|
* form a new syntax element using a list as a "body"
|
|
* completly independant syntax elements
|
|
Essentially, everything else that's not described in this article. Compound commands have the following characteristics:
|
|
* they **begin** and **end** with a specific keyword or operator (e.g. ''for ... done'')
|
|
* they can be redirected as a whole
|
|
|
|
See the following table for a short overview (no details - just an overview):
|
|
^Compound command syntax^Description^
|
|
|''( <LIST> )''|Execute ''<LIST>'' in an extra subshell => [[syntax:ccmd:grouping_subshell | article]]|
|
|
|''{ <LIST> ; }''|Execute ''<LIST>'' as separate group (but not in a subshell) => [[syntax:ccmd:grouping_plain | article]]|
|
|
|''<nowiki>((</nowiki> <EXPRESSION> ))''|Evaluate the arithmetic expression ''<EXPRESSION>'' => [[syntax:ccmd:arithmetic_eval | article]]|
|
|
|''<nowiki>[[</nowiki> <EXPRESSION> ]]''|Evaluate the conditional expression ''<EXPRESSION>'' (aka "the new test command") => [[syntax:ccmd:conditional_expression | article]]|
|
|
|''for <NAME> in <WORDS> ; do <LIST> ; done''|Executes ''<LIST>'' while setting the variable ''<NAME>'' to one of ''<WORDS>'' on every iteration (classic for-loop) => [[syntax:ccmd:classic_for | article]]|
|
|
|''for <nowiki>((</nowiki> <EXPR1> ; <EXPR2> ; <EXPR3> )) ; do <LIST> ; done''|C-style for-loop (driven by arithmetic expressions) => [[syntax:ccmd:c_for | article]]|
|
|
|''select <NAME> in <WORDS> ; do <LIST> ; done''|Provides simple menus => [[syntax:ccmd:user_select | article]]|
|
|
|''case <WORD> in <PATTERN>) <LIST> ;; ... esac''|Decisions based on pattern matching - executing ''<LIST>'' on match => [[syntax:ccmd:case | article]]|
|
|
|''if <LIST> ; then <LIST> ; else <LIST> ; fi''|The if clause: makes decisions based on exit codes => [[syntax:ccmd:if_clause | article]]|
|
|
|''while <LIST1> ; do <LIST2> ; done''|Execute ''<LIST2>'' while ''<LIST1>'' returns TRUE (exit code) => [[syntax:ccmd:while_loop | article]]|
|
|
|''until <LIST1> ; do <LIST2> ; done''|Execute ''<LIST2>'' until ''<LIST1>'' returns TRUE (exit code) => [[syntax:ccmd:until_loop | article]]|
|
|
|
|
|
|
|
|
|
|
===== Shell Function Definitions =====
|
|
FIXME Missing an additional article about shell functions
|
|
|
|
A shell function definition makes a [[basicgrammar#compound_commands | compound command]] available via a new name. When the function runs, it has its own "private" set of positional parameters and I/O descriptors. It acts like a script-within-the-script. Simply stated: **You've created a new command.**
|
|
|
|
The definition is easy (one of many possibilities):
|
|
|
|
''<NAME> () <COMPOUND_COMMAND> <REDIRECTIONS>''
|
|
|
|
which is usually used with the ''{...; }'' compound command, and thus looks like:
|
|
<code>
|
|
print_help() { echo "Sorry, no help available"; }
|
|
</code>
|
|
|
|
As above, a function definition can have any [[basicgrammar#compound_commands | compound command]] as a body. Structures like
|
|
<code>
|
|
countme() for ((x=1;x<=9;x++)); do echo $x; done
|
|
</code>
|
|
are unusual, but perfectly valid, since the for loop construct is a compound command!
|
|
|
|
If **redirection** is specified, the redirection is not performed when the function is defined. It is performed when the function runs:
|
|
<code>
|
|
# this will NOT perform the redirection (at definition time)
|
|
f() { echo ok ; } > file
|
|
|
|
# NOW the redirection will be performed (during EXECUTION of the function)
|
|
f
|
|
</code>
|
|
|
|
Bash allows three equivalent forms of the function definition:
|
|
<code>
|
|
NAME () <COMPOUND_COMMAND> <REDIRECTIONS>
|
|
function NAME () <COMPOUND_COMMAND> <REDIRECTIONS>
|
|
function NAME <COMPOUND_COMMAND> <REDIRECTIONS>
|
|
</code>
|
|
|
|
The space between ''NAME'' and ''()'' is optional, usually you see it without the space.
|
|
|
|
I suggest using the first form. It's specified in POSIX and all Bourne-like shells seem to support it.
|
|
|
|
__**Note:**__ Before version ''2.05-alpha1'', Bash only recognized the definition using curly braces (''name() { ... }''), other shells allow the definition using **any** command (not just the compound command set).
|
|
|
|
To execute a function like a regular shell script you put it together like this:
|
|
|
|
<code>
|
|
#!/bin/bash
|
|
# Add shebang
|
|
|
|
mycmd()
|
|
{
|
|
# this $1 belongs to the function!
|
|
find / -iname "$1"
|
|
}
|
|
|
|
# this $1 belongs the script itself!
|
|
mycmd "$1" # Execute command immediately after defining function
|
|
|
|
exit 0
|
|
</code>
|
|
|
|
**Just informational(1):**
|
|
|
|
Internally, for forking, Bash stores function definitions in environment variables. Variables with the content "//() ....//".
|
|
|
|
Something similar to the following works without "officially" declaring a function:
|
|
<code>
|
|
$ export testfn="() { echo test; }"
|
|
$ bash -c testfn
|
|
test
|
|
$
|
|
</code>
|
|
|
|
**Just informational(2):**
|
|
|
|
It is possible to create function names containing slashes:
|
|
|
|
<code>
|
|
/bin/ls() {
|
|
echo LS FAKE
|
|
}
|
|
</code>
|
|
|
|
The elements of this name aren't subject to a path search.
|
|
|
|
Weird function names should not be used. Quote from the maintainer:
|
|
* //
|
|
It was a mistake to allow such characters in function names (`unset' doesn't
|
|
work to unset them without forcing -f, for instance). We're stuck with them
|
|
for backwards compatibility, but I don't have to encourage their use.
|
|
//
|
|
|
|
|
|
===== Grammar summary =====
|
|
* a [[basicgrammar#simple_commands | simple command]] is just a command and its arguments
|
|
* a [[basicgrammar#pipelines | pipeline]] is one or more [[basicgrammar#simple_commands | simple command]] probably connected in a pipe
|
|
* a [[basicgrammar#lists | list]] is one or more [[basicgrammar#pipelines | pipelines]] connected by special operators
|
|
* a [[basicgrammar#compound_commands | compound command]] is a [[basicgrammar#lists | list]] or a special command that forms a new meta-command
|
|
* a [[basicgrammar#shell_function_definitions | function definition]] makes a [[basicgrammar#compound_commands | compound command]] available under a new name, and a separate environment
|
|
|
|
|
|
|
|
===== Examples for classification =====
|
|
FIXME more...
|
|
|
|
----
|
|
__A (very) simple command__
|
|
<code>
|
|
echo "Hello world..."
|
|
</code>
|
|
|
|
__All of the following are simple commands__
|
|
<code>x=5</code>
|
|
<code>>tmpfile</code>
|
|
<code>{x}<"$x" _=${x=<(echo moo)} <&0$(cat <&"$x" >&2)</code>
|
|
----
|
|
__A common compound command__
|
|
<code>
|
|
if [ -d /data/mp3 ]; then
|
|
cp mymusic.mp3 /data/mp3
|
|
fi
|
|
</code>
|
|
* the [[basicgrammar#compound_commands | compound command]] for the ''if'' clause
|
|
* the [[basicgrammar#lists | list]] that ''if'' **checks** actually contains the [[basicgrammar#simple_commands | simple command]] ''[ -d /data/mp3 ]''
|
|
* the [[basicgrammar#lists | list]] that ''if'' **executes** contains a simple command (''cp mymusic.mp3 /data/mp3'')
|
|
|
|
|
|
Let's invert test command exit code, only one thing changes:
|
|
<code>
|
|
if ! [ -d /data/mp3 ]; then
|
|
cp mymusic.mp3 /data/mp3
|
|
fi
|
|
</code>
|
|
* the [[basicgrammar#lists | list]] that ''if'' **checks** contains a [[basicgrammar#pipelines | pipeline]] now (because of the ''!'')
|
|
|
|
|
|
===== See also =====
|
|
|
|
* Internal: [[syntax:ccmd:intro | List of compound commands]]
|
|
* Internal: [[syntax:grammar:parser_exec | Parsing and execution of simple commands]]
|
|
* Internal: [[syntax:quoting | Quoting and escaping]]
|
|
* Internal: [[syntax:expansion:intro | Introduction to expansions and substitutions]]
|
|
* Internal: [[syntax:words | Some words about words...]]
|
|
</textarea>
|
|
<div id="wiki__editbar" class="editBar">
|
|
<div id="size__ctl">
|
|
</div>
|
|
</div>
|
|
</div></form>
|
|
</div>
|
|
</div><!-- /content --></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="small text-right">
|
|
|
|
<span class="docInfo">
|
|
<ul class="list-inline"><li><span class="iconify text-muted" data-icon="mdi:file-document-outline"></span> <span title="syntax/basicgrammar.txt">syntax/basicgrammar.txt</span></li><li><span class="iconify text-muted" data-icon="mdi:calendar"></span> Last modified: <span title="2019/04/01 21:45">2019/04/01 21:45</span></li><li class="text-muted">by <bdi>ddebhw</bdi></li></ul> </span>
|
|
|
|
|
|
</div>
|
|
|
|
</article>
|
|
|
|
|
|
</div>
|
|
|
|
</main>
|
|
|
|
<footer id="dw__footer" class="dw-container py-5 dokuwiki container-fluid">
|
|
<hr/>
|
|
<div align="center">
|
|
<h3><a target="_blank" href="http://web.archive.org/web/20221003082936/http://www.performing-databases.com/">This site is supported by Performing Databases - your experts for database administration</a></h3>
|
|
</div>
|
|
<hr/>
|
|
<div align="center">
|
|
<script async src="//web.archive.org/web/20221003082936js_/https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
|
|
<!-- BHORG_BOTTOM -->
|
|
<ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-4658830517838678" data-ad-slot="1603598940"></ins>
|
|
<script>
|
|
(adsbygoogle = window.adsbygoogle || []).push({});
|
|
</script>
|
|
</div>
|
|
|
|
<!-- footer -->
|
|
<div class="dw-container small container-fluid mx-5">
|
|
|
|
|
|
<div class="footer-dw-title">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<img src="/web/20221003082936im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/logo.png" alt="Bash Hackers Wiki" class="media-object" style="height:32px"/>
|
|
</div>
|
|
<div class="media-body">
|
|
<div class="row">
|
|
<div class="col-sm-2">
|
|
<h4 class="media-heading">Bash Hackers Wiki</h4>
|
|
<p>
|
|
</p>
|
|
</div>
|
|
<div class="col-sm-10">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="footer-license row">
|
|
<hr/>
|
|
<div id="dw__license" class="col-sm-6">
|
|
<p>
|
|
<a href="http://web.archive.org/web/20221003082936/http://www.gnu.org/licenses/fdl-1.3.html" title="GNU Free Documentation License 1.3" target="" itemscope itemtype="http://schema.org/CreativeWork" itemprop="license" rel="license" class="license"><img src="/web/20221003082936im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/license/gnufdl.png" width="24" height="24" alt="gnufdl"/> </a> </p>
|
|
<p class="small">
|
|
Except where otherwise noted, content on this wiki is licensed under the following license:<br/><a href="http://web.archive.org/web/20221003082936/http://www.gnu.org/licenses/fdl-1.3.html" title="GNU Free Documentation License 1.3" target="" itemscope itemtype="http://schema.org/CreativeWork" itemprop="license" rel="license" class="license">GNU Free Documentation License 1.3</a> </p>
|
|
</div>
|
|
|
|
<div class="col-sm-6">
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
<!-- /footer -->
|
|
</footer>
|
|
|
|
<a href="#dokuwiki__top" class="back-to-top hidden-print btn btn-default" title="skip to content" accesskey="t">
|
|
<span class="iconify" data-icon="mdi:chevron-up"></span> </a>
|
|
|
|
<div id="screen__mode"> <span class="visible-xs-block"></span>
|
|
<span class="visible-sm-block"></span>
|
|
<span class="visible-md-block"></span>
|
|
<span class="visible-lg-block"></span>
|
|
</div>
|
|
|
|
<img src="/web/20221003082936im_/https://wiki.bash-hackers.org/lib/exe/indexer.php?id=syntax%3Abasicgrammar&1664785790" width="2" height="1" alt=""/>
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|
|
<!--
|
|
FILE ARCHIVED ON 08:29:36 Oct 03, 2022 AND RETRIEVED FROM THE
|
|
INTERNET ARCHIVE ON 11:36:02 Apr 14, 2023.
|
|
JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE.
|
|
|
|
ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C.
|
|
SECTION 108(a)(3)).
|
|
-->
|
|
<!--
|
|
playback timings (ms):
|
|
captures_list: 112.822
|
|
exclusion.robots: 0.12
|
|
exclusion.robots.policy: 0.11
|
|
RedisCDXSource: 0.782
|
|
esindex: 0.008
|
|
LoadShardBlock: 84.673 (3)
|
|
PetaboxLoader3.datanode: 36.797 (4)
|
|
load_resource: 461.515
|
|
PetaboxLoader3.resolve: 434.444
|
|
--> |