getopt命令
最近学习了一下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命令的更多相关文章
- 使用getopt命令解析shell脚本的命令行选项 【转】
本文转载自:http://yejinxin.github.io/parse-shell-options-with-getopt-command 在之前的一篇文章中,介绍了如何利用shell内置的get ...
- php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数
在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法1.直接使用argv变量数组. 2.使用$_SER ...
- 自学Linux Shell13.2-选项处理(主要getopt、getopts命令)
点击返回 自学Linux命令行与Shell脚本之路 Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个 ...
- 使用 getopt 处理命令行长参数
getopt命令并不是bash的内建命令,它是由util-linux包提供的外部命令. getopt 与 getopts 的区别 getopts 是 shell 内建命令, getopt 是一个独立外 ...
- 命令行参数解析函数 getopt
命令行参数解析函数 —— getopt() getopt()函数声明如下: #include <unistd.h> int getopt(int argc, char * const ar ...
- shell 命令行参数(getopt和getopts)
getopt 命令 使用getopt命令,可以解析任何命令行选项和参数,但是用法比较复杂.getopt的命令用法如下: $ getopt --help 用法: getopt optstring par ...
- python命令行参数
〇.python中对应的argc, argv需要模块:sys参数个数:len(sys.argv)脚本名: sys.argv[0]参数1: sys.argv[1]参数2: sys. ...
- awk,perl,python的命令行参数处理
Python,Perl,Bash命令行参数 Part I 日常经常性的和Perl,Python,Bash打交道,但是又经常性的搞混他们之间,在命令行上的特殊性和index的区别,Python真的是人性 ...
- Linux c 下使用getopt()函数
命令行参数解析函数 —— getopt() getopt()函数声明如下: #include <unistd.h> int getopt(int argc, char * const ar ...
随机推荐
- 如何检查linux是否安装了php
方法一.在终端通过php -v命令来查看一下当前php的版本.如果没有安装php,一般会提示没有php这个命令的. 2 方法二.在终端查询安装的包中是否有php,以redhat为例,则可以执行如下命令 ...
- HDU 1051
题意:给你n个木块的长和宽,现在要把它送去加工,这里怎么说呢,就是放一个木块花费一分钟,如果后面木块的长和宽大于等于前面木块的长和宽就不需要花费时间,否则时间+1,问把这个木块送去加工的最短时间. 思 ...
- 基于 Laravel-Admin 在十分钟内搭建起功能齐全的后台模板
http://laravelacademy.org/post/6468.html 1.简介 为 Laravel 提供后台模板的项目越来越多,学院君已陆续为大家介绍过Laravel Angular Ad ...
- H3C 查看设备路由表
- P1045 和为给定数
题目描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入格式 共三行: 第一行是整数 \(n(0 \lt n \le 100000)\) ,表示有 \(n\) 个整数. 第二行是n个整数 ...
- POJ 1511 Invitation Cards(逆向思维 SPFA)
Description In the age of television, not many people attend theater performances. Antique Comedians ...
- 基于ubuntu16的mqtt服务器(apache-apollo1.7.1)
感谢博客:https://www.cnblogs.com/chenrunlin/p/5109028.html 需要环境: java1.8 把文件通过finalshell扔到/usr/local目录下 ...
- 2018.11.9浪在ACM集训队第四次测试赛
2018.11.9浪在ACM集训队第四次测试赛 整理人:朱远迪 A 生活大爆炸版 石头剪刀布 参考博客:[1] 刘凯 B 联合权值 参考博客: [1]田玉康 ...
- Linux 内核控制 urb
控制 urb 被初始化几乎和 块 urb 相同的方式, 使用对函数 usb_fill_control_urb 的 调用: void usb_fill_control_urb(struct urb *u ...
- vue-learning:9-template-v-model
表单元素的双向绑定指令v-model 目录 v-model的基础用法 v-model双向绑定实现的原理 v-model绑定值的输出类型(字符串.数组.布尔值.自定义) v-model修饰符:.lazy ...