$#  返回命令行参数个数

$n  接受终端指定位置参数

$*  接受终端所有参数(不包含 $0)

$@  接受终端所有参数(不包含 $0,在for循环时和 $* 的表现有差异)

$?  返回上一次程序的返回值

如果要让终端接受 -a 这样的 option,可以用 shell 内建的 getopts

getopts 用法:

# :ab:c 表示这一段代码只接受 -a 或 -b barg 或 -c 这样的选项,
while getopts :ab:c option
do
case $option in
a)
echo "option a is enabled"
;;
b)
echo "option b is enabled with arguments $OPTARG"
;;
c)
echo "option c is enabled"
;;
\?)
echo "no option is enabled"
exit
;;
esac
done

看看 getopts :ab:c option

getopts 会将匹配到的选项放到 option 变量,当然这个变量可以是其他名字,如果选项需要参数,就会把参数放到 OPTARG 变量,

getopts 里还可以用一个叫做 OPTIND 变量,用于指示当前选项在终端参数的位置

a 前面(也就是参数列表前面)的冒号会屏蔽 getopts 的错误消息,当选项没有匹配项时,getops 会提示错误。

ac 选项都没有参数
b 后面的冒号表示该选项后面需要跟一个参数,它的参数就被放到了 OPTARG 变量里

假设我们把这段代码写到一个叫做 task 的脚本或者函数里, 那么输入 task -ac 可以看到这样的内容

$ task -ac
option a is enabled
option c is enabled

输入 task -b  argb

$ task -b argb
option b is enabled with arguments argb

注意,如果 -b 选项 没有带参数,又没有在参数列表前加上冒号,就会报错 b 选项没有接参数。

尽管用 getopts 可以支持选项化的参数,但是它有几个个缺点:不支持长选项 - help 或者 --help 这类的选项,对于其他非选项的终端参数则会忽略,而且 getopts 的选项要么带参数,要么不带参数。


如果需要使用长选项,可以考虑使用 getopt 这个内建命令。

ARGS=`getopt -o ab:c:: -al along,blong:,clong:: -n "example.sh" -- $*`   # -n 选项指定一个脚本,当终端参数解析出错的时候调用

eval set -- "$ARGS"  # 将解析到的参数分配至 $  $  等变量

while  true
do
case $ in
-a|--along)
echo "option $1 is enabled"
shift
;;
-b|--blong)
echo "option $1 is enabled with argument $2"
shift
;;
-c|--clong)
echo "option $1 is enabled with argument $2"
shift
;;
--)
break
;;
esac
done for otherargs in $@
do
echo $otherargs
done

a 选项不带参数,b 选项必须带参数,而 c 选项的参数是可选的,若要向 c 选项传递参数,

$ task -cargs  # 注意上面 getopt 长选项用到了 -a 选项,所以 cargs 不能是写成 clong,否则 getopt 会将识别成长选项 clong;或者也可以关掉 getopt 的 -a 选项
### or ###
$task -clong=args $task -c
$task -clong

用了 getopt 之后,传入脚本或函数的所有参数都可以使用了,并且还可以使用长选项,用起来很方便。

reference:

使用getopt命令解析shell脚本的命令行选项

shell脚本的使用的更多相关文章

  1. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  2. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  3. shell脚本规划化模板

    shell脚本规划化模板 Linux运维过程中,shell脚本是不可缺少的工具,但是每个运维人员编程的习惯都不一样,很多时候就是实现某个功能,写出来的脚本都是烂七八糟的.脚本必须规范化,应该从以后几个 ...

  4. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  5. Linux Shell脚本逻辑操作符简介

    在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...

  6. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  7. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  8. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  9. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  10. shell 脚本之循环使用 for while 详解

    任何一种编程语言中循环是比不可少的,当然 shell 脚本也少不了循环语句,包括 for 语句. while 语句.文中主要以实际用例来说明 for while 都有哪些常见的使用方法和技巧. 一.f ...

随机推荐

  1. .NET 开源GIS解决方案一 概述

    写在前面 最近开始研究开源GIS,国内开源GIS的资料很少,而基于.net的又是少之又少.所以决定把自己研究的资料进行总结整理,技术在于分享,本系列(计划是写一个系列,如果我可以坚持下来的话)部分是自 ...

  2. TensorFlow实现卷积神经网络

    1 卷积神经网络简介 在介绍卷积神经网络(CNN)之前,我们需要了解全连接神经网络与卷积神经网络的区别,下面先看一下两者的结构,如下所示: 图1 全连接神经网络与卷积神经网络结构 虽然上图中显示的全连 ...

  3. NSNumber数字

    前言 将基本数据类型包装成 OC 对象 1.NSNumber 与 基本数据类型 的相互转换 // 基本数据类型 转 NSNumber // 对象方法,将整形数据转换为 OC 对象 NSNumber * ...

  4. 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」

    题意 有一张 \(n\times m\) 的数表,其第\(i\)行第\(j\)列的数值为能同时整除\(i\)和\(j\)的所有自然数之和. \(T\)组数据,询问对于给定的 \(n,m,a\) , 计 ...

  5. 使用Shader Graph实现《塞尔达传说:旷野之息》风格的着色器

    https://mp.weixin.qq.com/s/19Xq6wYuXP0gQJDvC9Fh0g

  6. angular原理及模块简介

    Angular简介(大神可略过) Angular是一个强大的前端框架,其强大之处主要是可以把静态页面与动态数据绑定起来.平时我们看到的网页界面上面的数据都是固定,但如果我们要变化这些数据,例如我在一个 ...

  7. html之表单和简单CSS

    一.==表单== 1. form表单本身 <form name="myform" action="#" method="get"> ...

  8. Boost lockfree deque 生产者与消费者多对多线程应用

    boost库中有一个boost::lockfree::queue类型的 队列,对于一般的需要队列的程序,其效率都算不错的了,下面使用一个用例来说明. 程序是一个典型的生产者与消费者的关系,都可以使用多 ...

  9. 常用JS事件对象

    事件源对象event.srcElement.tagNameevent.srcElement.type 捕获释放event.srcElement.setCapture(); event.srcEleme ...

  10. Visual Studio 2017 Key激活码

     Microsoft Visual Studio Enterprise 2017 企业版 KEY:NJVYC-BMHX2-G77MM-4XJMR-6Q8QFMicrosoft Visual Studi ...