$#  返回命令行参数个数

$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. 反欺诈(Fraud Detection)中所用到的机器学习模型

    反欺诈应用的机器模型算法,多为二分类算法. 1.gbdt梯度提升决策树(Gradient Boosting Decision Tree,GBDT)算法,该算法的性能高,且在各类数据挖掘中应用广泛,表现 ...

  2. Android下创建一个输入法

    输入法是一种可以让用户输入文字的控件.Android提供了一套可扩展的输入法框架,使得应用程序可以让用户选择各种类型的输入法,比如基于触屏的键盘输入或者基于语音.当安装了特定输入法之后,用户即可在系统 ...

  3. 407. Trapping Rain Water II

    Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...

  4. C#中工厂模式的作用

    1.比如,主要用于对扩展性有要求的功能. 以简单工厂为例: 接口Fun有三个实现 class FunA FunB FunC工厂 class Fac {   public static Fun getF ...

  5. vue2.0 vs vue1.0

    1.每个组件模板不支持代码片段组件中模板之前<template> <h3>as</h3></template>现在 必须要有根元素 包裹住所有代码< ...

  6. Xml Helper

    类的完整代码: using System;using System.Collections;using System.Xml; namespace Keleyi.Com.XmlDAL{public c ...

  7. 设置django在linux后台运行&查看端口使用

    1.后台运行(&),允许所有用户(0.0.0.0)访问,端口为8888 nohup python manage.py runserver 0.0.0.0 8888 & 2.由端口号88 ...

  8. 给花_Q

  9. AtCoder Beginner Contest 120 题解

    题目链接:https://atcoder.jp/contests/abc120 A Favorite Sound 分析:答案为. 代码: #include <iostream> using ...

  10. 基础线程机制--Executor线程池框架

    基础线程机制 Executor线程池框架 1.引入Executor的原因 (1)new Thread()的缺点 ​  每次new Thread()耗费性能 ​  调用new Thread()创建的线程 ...