最近学习了一下getopt(不是getopts)命令来处理执行shell脚本传入的参数,在此记录一下,包括长选项、短选项、以及选项的值出现的空格问题,最后写了个小的脚本来处理输入的参数

首先新建一个test.sh来测试

短选项

test.sh内容

#! /bin/sh
echo `getopt a:b::c "$@"`
  • $@ 代表传递的参数,加上双引号很关键
  • 反引号代表将其中的命令先执行一遍
  • a:代表选项a后必须有值,b::代表选项b后的值可有可无,c代表选项c后无值

运行

sh test.sh -a 1 -b2 -c 3 4

  • 选项b后如果有参数则必须紧跟在b后面,不能加空格

结果

-a 1 -b 2 -c -- 3 4

  • 双横线左侧表示正确识别出的参数,双横线右边表示为无关参数

长选项

test.sh内容

#! /bin/sh
echo `getopt -o a:b::c -l along:,blong::,clong -- "$@"`
  • 必须指定短选项
  • 长选项之间使用逗号进行分隔
  • 将指令和参数之间使用 -- 分隔开来,方便getop来区分,否则有些地方getopt会识别错误

运行

sh test.sh -a 1 -b2 -c 3 4

结果

-a '1' -b '2' -c -- '3' '4'

具体什么时候带 -- 看getopt的help说明

Usage:
getopt <optstring> <parameters>
getopt [options] [--] <optstring> <parameters>
getopt [options] -o|--options <optstring> [options] [--] <parameters>

运行

sh test.sh --along=1 --blong=2 --clong

  • 长选项之前需要用双横线 --
  • 带参数的长选项后面需要加 =

结果

--along '1' --blong '2' --clong --

参数带空格

"$@"需要带双引号,不带会识别出错

test.sh内容和上面一致

#! /bin/sh
echo `getopt -o a:b::c -l along:,blong::,clong -- "$@"`

短选项

运行

sh test.sh -a 1 -b2020-01-08 15:00:00 -c 3 4

结果

-a '1' -b '2020-01-08' -c -- '15:00:00' '3' '4'

  • 可以看到后面的时分秒并不会识别为参数

运行

sh test.sh -a 1 -b"2020-01-08 15:00:00 "-c 3 4

结果

-a '1' -b '2020-01-08 15:00:00 -c' -- '3' '4'

  • 只要在值两边加上双引号就可以了,别忘了脚本中的$@也要加双引号

长选项

与短选项相同

运行

sh test.sh --along=12 --blong="2020-01-08 15:00:00" --clong

结果

--along '12' --blong '2020-01-08 15:00:00' --clong --

处理具体参数

下面这个脚本是将输入的参数赋值到具体变量上去

#! /bin/sh
ARGS=`getopt -o a:b::c -l along:,blong::,clong -- "$@"` #getopt是否执行成功
if [[ $? -ne 0 ]]
then exit 1
fi #处理空格,不加eval会将2020-01-08 15:00:00分到两个位置参数上
eval set -- "${ARGS}" while [[ -n "$1" ]]
do
case "$1" in
-a|--along)
along=$2
shift 2
;;
-b|--blong)
case "$2" in
"")
#指定个默认值吧
blong=false
shift 2
;;
*)
blong=$2
shift 2
;;
esac
;;
-c|--clong)
echo "option c 无参数"
shift
;;
--)
shift
break
;;
*)
echo "ERROR OPTION!"
exit 1
;;
esac
done args="args: along:\"${along}\",blong:\"${blong}\"" echo ${args}

运行

sh test.sh --along=1 --blong="123" --clong

结果

 args: along:"1",blong:"123"

以上就是整理的getopt命令的内容,如果有错误的地方还请指正

参考:

http://yejinxin.github.io/parse-shell-options-with-getopt-command

getopt命令的更多相关文章

  1. 使用getopt命令解析shell脚本的命令行选项 【转】

    本文转载自:http://yejinxin.github.io/parse-shell-options-with-getopt-command 在之前的一篇文章中,介绍了如何利用shell内置的get ...

  2. php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数

    在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法1.直接使用argv变量数组. 2.使用$_SER ...

  3. 自学Linux Shell13.2-选项处理(主要getopt、getopts命令)

    点击返回 自学Linux命令行与Shell脚本之路 Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个 ...

  4. 使用 getopt 处理命令行长参数

    getopt命令并不是bash的内建命令,它是由util-linux包提供的外部命令. getopt 与 getopts 的区别 getopts 是 shell 内建命令, getopt 是一个独立外 ...

  5. 命令行参数解析函数 getopt

    命令行参数解析函数 —— getopt() getopt()函数声明如下: #include <unistd.h> int getopt(int argc, char * const ar ...

  6. shell 命令行参数(getopt和getopts)

    getopt 命令 使用getopt命令,可以解析任何命令行选项和参数,但是用法比较复杂.getopt的命令用法如下: $ getopt --help 用法: getopt optstring par ...

  7. python命令行参数

    〇.python中对应的argc, argv需要模块:sys参数个数:len(sys.argv)脚本名:    sys.argv[0]参数1:     sys.argv[1]参数2:     sys. ...

  8. awk,perl,python的命令行参数处理

    Python,Perl,Bash命令行参数 Part I 日常经常性的和Perl,Python,Bash打交道,但是又经常性的搞混他们之间,在命令行上的特殊性和index的区别,Python真的是人性 ...

  9. Linux c 下使用getopt()函数

    命令行参数解析函数 —— getopt() getopt()函数声明如下: #include <unistd.h> int getopt(int argc, char * const ar ...

随机推荐

  1. 梯度优化算法Adam

    最近读一个代码发现用了一个梯度更新方法, 刚开始还以为是什么奇奇怪怪的梯度下降法, 最后分析一下是用一阶梯度及其二次幂做的梯度更新.网上搜了一下, 果然就是称为Adam的梯度更新算法, 全称是:自适应 ...

  2. [kuangbin带你飞]专题九 连通图E POJ 3177 Redundant Paths

    这个题最开始我想的是,直接缩点求双连通分量,连接这些双联通分量不就行了吗? 但是其实是不对的,双连通内部双联通,我们如果任意的连接一条边在这些双联通分量之间,他们之间有没有桥其实并不知道. 我应该是求 ...

  3. activiti 如何使用database前缀来区分activiti数据库和业务数据库

    为什么80%的码农都做不了架构师?>>> 第一步是先集成好activiti,我使用的是5.22.0,使用springboot集成,pom文件如下: ​ <parent> ...

  4. http端口

    HTTPS全称是Hyper Text Transfer Protocol over Secure Socket Layer, 即http的安全版. https使用的端口是443,而http的端口是80 ...

  5. 我去!JS的原型是咋回事?

    我去!JS的原型是咋回事? 最近写公司的项目,写着写着发现自己的原型的理解还是不够透彻,又去网上查了一番资料,顺便总结一下,在顺便给到的朋友能提供一点帮助.如有遗漏,欢迎交流. 原型是啥?为什么要用原 ...

  6. Python--day27--设计模式

    设计模式:单例模式

  7. Codeforces Round #183 (Div. 2)

    A. Pythagorean Theorem II 暴力,\(O(n^2)\). B. Calendar 每个日期计算到0年1月1日的天数,相当于转化成前缀和形式. 闰年数计算\[\lfloor\fr ...

  8. CF351E Jeff and Permutation

    CF351E Jeff and Permutation 贪心好题 考虑每个对能否最小化贡献和 先不考虑绝对值相同情况 发现,对于a,b假设|a|<|b|,那么有无贡献只和b的正负有关!如果a在b ...

  9. java Scanner(简单文本扫描器)

    Scanner(File source)  构造一个新的 Scanner,它生成的值是从指定文件扫描的. 备注:实现了Iterable接口   package june6D; import java. ...

  10. 【mac】Mac 终端如何切换成管理员用户

    方法1.打开终端输入 sudo su  然后回车 Password:  ------(输入root密码即可) sh-3.2# --------    (输入执行的命令即可,例如 npm i -g np ...