wiki.bash-hackers.org/scripting/posparams
2023-04-14 23:44:41 +12:00

739 lines
36 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/scripting/posparams?do=edit","20220925044221","http://web.archive.org/","web","/_static/",
"1664080941");
</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>Handling positional parameters [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/20220925044221im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/favicon.ico"/>
<link rel="apple-touch-icon" href="/web/20220925044221im_/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/20220925044221cs_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/bootstrap/default/bootstrap.min.css"/>
<link rel="search" type="application/opensearchdescription+xml" href="/web/20220925044221/https://wiki.bash-hackers.org/lib/exe/opensearch.php" title="Bash Hackers Wiki"/>
<link rel="start" href="/"/>
<link rel="contents" href="/scripting/posparams?do=index" title="Sitemap"/>
<link rel="manifest" href="/web/20220925044221/https://wiki.bash-hackers.org/lib/exe/manifest.php"/>
<link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/web/20220925044221/https://wiki.bash-hackers.org/feed.php"/>
<link rel="alternate" type="application/rss+xml" title="Current namespace" href="/web/20220925044221/https://wiki.bash-hackers.org/feed.php?mode=list&amp;ns=scripting"/>
<link rel="alternate" type="text/html" title="Plain HTML" href="/web/20220925044221/https://wiki.bash-hackers.org/_export/xhtml/scripting/posparams"/>
<link rel="alternate" type="text/plain" title="Wiki Markup" href="/web/20220925044221/https://wiki.bash-hackers.org/_export/raw/scripting/posparams"/>
<link rel="stylesheet" type="text/css" href="/web/20220925044221cs_/https://wiki.bash-hackers.org/lib/exe/css.php?t=bootstrap3&amp;tseed=54923c3deda180f2db5bd755cd8fbf1a"/>
<!--[if gte IE 9]><!-->
<script type="text/javascript">/*<![CDATA[*/var NS='scripting';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":"scripting:posparams","namespace":"scripting","ACT":"source","useHeadingNavigation":1,"useHeadingContent":1};
/*!]]>*/</script>
<script type="text/javascript" charset="utf-8" src="/web/20220925044221js_/https://wiki.bash-hackers.org/lib/exe/jquery.php?tseed=23f888679b4f1dc26eef34902aca964f"></script>
<script type="text/javascript" charset="utf-8" src="/web/20220925044221js_/https://wiki.bash-hackers.org/lib/exe/js.php?t=bootstrap3&amp;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/20220925044221js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/web/20220925044221js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/anchorjs/anchor.min.js"></script>
<script type="text/javascript" src="/web/20220925044221js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/typeahead/bootstrap3-typeahead.min.js"></script>
<script type="text/javascript" src="/web/20220925044221js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/iconify/iconify.min.js"></script>
<script type="text/javascript" src="/web/20220925044221js_/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="scripting:posparams"><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/20220925044221/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/20220925044221im_/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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams" 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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?do=login&amp;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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?do=media&amp;ns=scripting" 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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?do=login&amp;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/20220925044221js_/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/20220925044221/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/20220925044221/https://wiki.bash-hackers.org/scripting/start" class="wikilink2" title="scripting:start" rel="nofollow">scripting</a></li><li class="active" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name"><a itemprop="item" href="/web/20220925044221/https://wiki.bash-hackers.org/scripting/posparams" class="wikilink1" title="scripting:posparams">Handling positional parameters</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">scripting:posparams</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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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/20220925044221/https://wiki.bash-hackers.org/scripting/posparams?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="scripting:posparams"/><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="dd33df2b85e12723c1c6de6098c93b57"/><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">
====== Handling positional parameters ======
{{keywords&gt;bash shell scripting arguments positional parameters options}}
===== Intro =====
The day will come when you want to give arguments to your scripts. These arguments are known as **positional parameters**. Some relevant special parameters are described below:
^Parameter(s)^Description^
|''$0''|the first positional parameter, equivalent to ''argv[0]'' in C, see [[scripting:posparams#the_first_argument | the first argument]]|
|''$FUNCNAME''| the function name (__**attention**__: inside a function, ''$0'' is still the ''$0'' of the shell, **not** the function name)|
|''$1 ... $9''|the argument list elements from 1 to 9|
|''${10} ... ${N}''|the argument list elements beyond 9 (note the [[syntax:pe | parameter expansion]] syntax!)|
|''$*''|all positional parameters except ''$0'', see [[scripting:posparams#mass_usage | mass usage]]|
|''$@''|all positional parameters except ''$0'', see [[scripting:posparams#mass_usage | mass usage]]|
|''$#''|the number of arguments, not counting ''$0''|
These positional parameters reflect exactly what was given to the
script when it was called.
Option-switch parsing (e.g. ''-h'' for displaying help) is not performed at
this point.
See also [[dict:terms:parameter | the dictionary entry for &quot;parameter&quot;]].
===== The first argument =====
The very first argument you can access is referenced as ''$0''. It
is usually set to the script's name exactly as called, and it's
set on shell initialization:
__Testscript__ - it just echos ''$0'':
&lt;code&gt;
#!/bin/bash
echo &quot;$0&quot;
&lt;/code&gt;
You see, ''$0'' is always set to the name the script is called with (''&gt;'' is the prompt...):
&lt;code&gt;
&gt; ./testscript
./testscript
&lt;/code&gt;
&lt;code&gt;
&gt; /usr/bin/testscript
/usr/bin/testscript
&lt;/code&gt;
However, this isn't true for login shells:
&lt;code&gt;
&gt; echo &quot;$0&quot;
-bash
&lt;/code&gt;
In other terms, ''$0'' is not a positional parameter, it's a
special parameter independent from the positional parameter list. It
can be set to anything. In the **ideal** case it's the pathname
of the script, but since this gets set on invocation, the invoking
program can easily influence it (the ''login'' program does that for
login shells, by prefixing a dash, for example).
Inside a function, ''$0'' still behaves as described above. To
get the function name, use ''$FUNCNAME''.
===== Shifting =====
The builtin command ''shift'' is used to change the positional parameter values:
* ''$1'' will be discarded
* ''$2'' will become ''$1''
* ''$3'' will become ''$2''
* ...
* in general: ''$N'' will become ''$N-1''
The command can take a number as argument: Number of positions to shift.
e.g. ''shift 4'' shifts ''$5'' to ''$1''.
===== Using them =====
Enough theory, you want to access your script-arguments. Well, here we go.
==== One by one ====
One way is to access specific parameters:
&lt;code&gt;
#!/bin/bash
echo &quot;Total number of arguments: $#&quot;
echo &quot;Argument 1: $1&quot;
echo &quot;Argument 2: $2&quot;
echo &quot;Argument 3: $3&quot;
echo &quot;Argument 4: $4&quot;
echo &quot;Argument 5: $5&quot;
&lt;/code&gt;
While useful in another situation, this way is lacks flexibility.
The maximum number of arguments is a fixedvalue
- which is a bad idea if you write a script that takes many filenames
as arguments.
=&gt; forget that one
==== Loops ====
There are several ways to loop through the positional parameters.
----
You can code a [[syntax:ccmd:c_for | C-style for-loop]] using ''$#''
as the end value. On every iteration, the ''shift''-command is used to
shift the argument list:
&lt;code&gt;
numargs=$#
for ((i=1 ; i &lt;= numargs ; i++))
do
echo &quot;$1&quot;
shift
done
&lt;/code&gt;
Not very stylish, but usable. The ''numargs'' variable is used
to store the initial value of ''$#'' because the shift command
will change it as the script runs.
----
Another way to iterate one argument at a time is the ''for'' loop
without a given wordlist. The loop uses the positional parameters as a wordlist:
&lt;code&gt;
for arg
do
echo &quot;$arg&quot;
done
&lt;/code&gt;
__Advantage:__ The positional parameters will be preserved
----
The next method is similar to the first example (the ''for'' loop), but
it doesn't test for reaching ''$#''. It shifts and checks if ''$1''
still expands to something, using the [[commands:classictest | test command]]:
&lt;code&gt;
while [ &quot;$1&quot; ]
do
echo &quot;$1&quot;
shift
done
&lt;/code&gt;
Looks nice, but has the disadvantage of stopping when ''$1'' is empty
(null-string). Let's modify it to run as long as ''$1'' is defined
(but may be null), using [[syntax:pe#use_an_alternate_value | parameter expansion for an alternate value]]:
&lt;code&gt;
while [ &quot;${1+defined}&quot; ]; do
echo &quot;$1&quot;
shift
done
&lt;/code&gt;
==== Getopts ====
There is a [[howto:getopts_tutorial|small tutorial dedicated to ''getopts'']] (//under construction//).
===== Mass usage =====
==== All Positional Parameters ====
Sometimes it's necessary to just &quot;relay&quot; or &quot;pass&quot; given
arguments to another program. It's very inefficient to do that in one
of these loops, as you will destroy integrity, most likely
(spaces!).
The shell developers created ''$*'' and ''$@'' for this purpose.
As overview:
^Syntax ^Effective result ^
| ''$*'' | ''$1 $2 $3 ... ${N}'' |
| ''$@'' | ''$1 $2 $3 ... ${N}'' |
| ''&quot;$*&quot;'' | ''&quot;$1c$2c$3c...c${N}&quot;'' |
| ''&quot;$@&quot;'' | ''&quot;$1&quot; &quot;$2&quot; &quot;$3&quot; ... &quot;${N}&quot;'' |
Without being quoted (double quotes), both have the same
effect: All positional parameters from ''$1'' to the last one used are
expanded without any special handling.
When the ''$*'' special parameter is double quoted, it expands to the
equivalent of: ''&quot;$1c$2c$3c$4c........$N&quot;'', where 'c' is the first
character of ''IFS''.
But when the ''$@'' special parameter is used inside double quotes, it
expands to the equivanent of...
''&quot;$1&quot; &quot;$2&quot; &quot;$3&quot; &quot;$4&quot; ..... &quot;$N&quot;''
...which **reflects all positional parameters as they were
set initially** and passed to the script or function. If you want
to re-use your positional parameters to **call another program** (for
example in a wrapper-script), then this is the choice for you, use
double quoted ''&quot;$@&quot;''.
Well, let's just say: **You almost always want a quoted ''&quot;$@&quot;''!**
==== Range Of Positional Parameters ====
Another way to mass expand the positional parameters is similar to
what is possible for a range of characters using
[[syntax:pe#substring_expansion | substring expansion]] on normal
parameters and the mass expansion range of [[syntax:arrays | arrays]].
''${@:START:COUNT}''
''${*:START:COUNT}''
''&quot;${@:START:COUNT}&quot;''
''&quot;${*:START:COUNT}&quot;''
The rules for using ''@'' or ''*'' and quoting are the same as
above. This will expand ''COUNT'' number of positional parameters
beginning at ''START''. ''COUNT'' can be omitted (''${@:START}''), in
which case, all positional parameters beginning at ''START'' are
expanded.
If ''START'' is negative, the positional parameters are numbered in reverse
starting with the last one.
''COUNT'' may not be negative, i.e. the element count may not be decremented.
__**Example:**__
START at the last positional parameter:
&lt;code&gt;
echo &quot;${@: -1}&quot;
&lt;/code&gt;
__**Attention**__: As of Bash 4, a ''START'' of ''0'' includes the special parameter ''$0'', i.e. the shell name or whatever $0 is set to, when the positional parameters are in use. A ''START'' of ''1'' begins at ''$1''. In Bash 3 and older, both ''0'' and ''1'' began at ''$1''.
===== Setting Positional Parameters =====
Setting positional parameters with command line arguments,
is not the only way to set them.
The [[ commands:builtin:set | builtin command, set ]]
may be used to &quot;artificially&quot; change the positional parameters from
inside the script or function:
&lt;code&gt;
set &quot;This is&quot; my new &quot;set of&quot; positional parameters
# RESULTS IN
# $1: This is
# $2: my
# $3: new
# $4: set of
# $5: positional
# $6: parameters
&lt;/code&gt;
It's wise to signal &quot;end of options&quot; when setting positional
parameters this way. If not, the dashes might be interpreted as an option switch
by ''set'' itself:
&lt;code&gt;
# both ways work, but behave differently. See the article about the set command!
set -- ...
set - ...
&lt;/code&gt;
Alternately this will also preserve any verbose (-v) or tracing (-x) flags, which may otherwise be reset by ''set''
&lt;code&gt;
set -$- ...
&lt;/code&gt;
FIXME continue
===== Production examples =====
==== Using a while loop ====
To make your program accept options as standard command syntax:
''COMMAND [options] &lt;params&gt;'' # Like 'cat -A file.txt'
See simple option parsing code below. It's not that flexible. It
doesn't auto-interpret combined options (-fu USER) but it works and is
a good rudimentary way to parse your arguments.
&lt;code&gt;
#!/bin/sh
# Keeping options in alphabetical order makes it easy to add more.
while :
do
case &quot;$1&quot; in
-f | --file)
file=&quot;$2&quot; # You may want to check validity of $2
shift 2
;;
-h | --help)
display_help # Call your function
# no shifting needed here, we're done.
exit 0
;;
-u | --user)
username=&quot;$2&quot; # You may want to check validity of $2
shift 2
;;
-v | --verbose)
# It's better to assign a string, than a number like &quot;verbose=1&quot;
# because if you're debugging the script with &quot;bash -x&quot; code like this:
#
# if [ &quot;$verbose&quot; ] ...
#
# You will see:
#
# if [ &quot;verbose&quot; ] ...
#
# Instead of cryptic
#
# if [ &quot;1&quot; ] ...
#
verbose=&quot;verbose&quot;
shift
;;
--) # End of all options
shift
break;
-*)
echo &quot;Error: Unknown option: $1&quot; &gt;&amp;2
exit 1
;;
*) # No more options
break
;;
esac
done
# End of file
&lt;/code&gt;
==== Filter unwanted options with a wrapper script ====
This simple wrapper enables filtering unwanted options (here: ''-a''
and ''--all'' for ''ls'') out of the command line. It reads the
positional parameters and builds a filtered array consisting of them, then
calls ''ls'' with the new option set. It also respects the ''--''
as &quot;end of options&quot; for ''ls'' and doesn't change anything after it:
&lt;code&gt;
#!/bin/bash
# simple ls(1) wrapper that doesn't allow the -a option
options=() # the buffer array for the parameters
eoo=0 # end of options reached
while [[ $1 ]]
do
if ! ((eoo)); then
case &quot;$1&quot; in
-a)
shift
;;
--all)
shift
;;
-[^-]*a*|-a?*)
options+=(&quot;${1//a}&quot;)
shift
;;
--)
eoo=1
options+=(&quot;$1&quot;)
shift
;;
*)
options+=(&quot;$1&quot;)
shift
;;
esac
else
options+=(&quot;$1&quot;)
# Another (worse) way of doing the same thing:
# options=(&quot;${options[@]}&quot; &quot;$1&quot;)
shift
fi
done
/bin/ls &quot;${options[@]}&quot;
&lt;/code&gt;
==== Using getopts ====
There is a [[howto:getopts_tutorial|small tutorial dedicated to ''getopts'']] (//under construction//).
===== See also =====
* Internal: [[howto:getopts_tutorial]]
* Internal: [[syntax:ccmd:while_loop]]
* Internal: [[syntax:ccmd:c_for]]
* Internal: [[syntax:arrays]] (for equivalent syntax for mass-expansion)
* Internal: [[syntax:pe#substring_expansion | Substring expansion on a parameter]] (for equivalent syntax for mass-expansion)
* Dictionary, internal: [[dict:terms:parameter]]
</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="scripting/posparams.txt">scripting/posparams.txt</span></li><li><span class="iconify text-muted" data-icon="mdi:calendar"></span> Last modified: <span title="2018/05/12 18:04">2018/05/12 18:04</span></li><li class="text-muted">by <bdi>wayeoyuz</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/20220925044221/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/20220925044221js_/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/20220925044221im_/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/20220925044221/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/20220925044221im_/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/20220925044221/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/20220925044221im_/https://wiki.bash-hackers.org/lib/exe/indexer.php?id=scripting%3Aposparams&amp;1664080954" width="2" height="1" alt=""/>
</div>
</body>
</html>
<!--
FILE ARCHIVED ON 04:42:21 Sep 25, 2022 AND RETRIEVED FROM THE
INTERNET ARCHIVE ON 11:35:24 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: 145.875
exclusion.robots: 0.211
exclusion.robots.policy: 0.195
RedisCDXSource: 1.538
esindex: 0.01
LoadShardBlock: 116.957 (3)
PetaboxLoader3.datanode: 111.897 (4)
load_resource: 96.671
PetaboxLoader3.resolve: 68.617
-->