【Linux学习】Shell命令行参数解析工具getopts是如何使用的?
一、学习背景最近通过python实现了发送消息给企业微信的功能,参考链接:【Jenkins学习 】如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果?https://blog.csdn.net/qq446282412/article/details/86361318但是并不是每台Linux服务器上都有合适的python版本,之前这个python脚...
一、学习背景
最近通过python实现了发送消息给企业微信的功能,参考链接:
- 【Jenkins学习 】如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果?
- https://blog.csdn.net/qq446282412/article/details/86361318
但是并不是每台Linux服务器上都有合适的python版本,之前这个python脚本是运行在Python 2环境下的,但是可能新的Linux服务器上装的是Python 3 之类的,因此可能写一个Shell脚本更加通用,因此我准备来写个Shell脚本来实现发送消息给企业微信。
但是写好的脚本都是需要传入参数的,因此学习一下Shell命令行参数解析工具getopts是如何使用的?
其实上一篇文章中我已经有描述了getopts的用法,现在来学习一下。
- 【Linux学习】解决Linux环境下执行脚本时报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录
- https://blog.csdn.net/ouyang_peng/article/details/86488451
之前有一篇文章介绍了
二、getopts 介绍
2.1 我们先来看看 ls命令的选项
在Linux系统中,许多命令都提供了选项,使用不同的选项就会得到不通的执行结果
例如:ls命令,ls命令提供了多个选项:-l、-a、-A、-h、-i等等,每个选项具有不同的功能,如下所示:
root@ubuntu116:/data/gitlabData/auto_back_shell# ls --help
用法:ls [选项]... [文件]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all 不隐藏任何以. 开始的项目
-A, --almost-all 列出除. 及.. 以外的任何项目
--author 与-l 同时使用时列出每个文件的作者
-b, --escape 以八进制溢出序列表示不可打印的字符
--block-size=SIZE scale sizes by SIZE before printing them. E.g.,
'--block-size=M' prints sizes in units of
1,048,576 bytes. See SIZE format below.
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
modification of file status information)
with -l: show ctime and sort by name
otherwise: sort by ctime, newest first
-C list entries by columns
--color[=WHEN] colorize the output. WHEN defaults to 'always'
or can be 'never' or 'auto'. More info below
-d, --directory list directory entries instead of contents,
and do not dereference symbolic links
-D, --dired generate output designed for Emacs' dired mode
-f do not sort, enable -aU, disable -ls --color
-F, --classify append indicator (one of */=>@|) to entries
--file-type likewise, except do not append '*'
--format=WORD across -x, commas -m, horizontal -x, long -l,
single-column -1, verbose -l, vertical -C
--full-time like -l --time-style=full-iso
-g 类似-l,但不列出所有者
--group-directories-first
在文件前分组目录。此选项可与--sort 一起使用,
但是一旦使用--sort=none (-U)将禁用分组
-G, --no-group 以一个长列表的形式,不输出组名
-h, --human-readable 与-l 一起,以易于阅读的格式输出文件大小
(例如 1K 234M 2G)
--si 同上面类似,但是使用1000 为基底而非1024
-H, --dereference-command-line
跟随命令行列出的符号链接
--dereference-command-line-symlink-to-dir
跟随命令行列出的目录的符号链接
--hide=PATTERN 隐藏符合PATTERN 模式的项目
(-a 或 -A 将覆盖此选项)
--indicator-style=WORD append indicator with style WORD to entry names:
none (default), slash (-p),
file-type (--file-type), classify (-F)
-i, --inode print the index number of each file
-I, --ignore=PATTERN do not list implied entries matching shell PATTERN
-k, --kibibytes use 1024-byte blocks
-l 使用较长格式列出信息
-L, --dereference 当显示符号链接的文件信息时,显示符号链接所指示
的对象而并非符号链接本身的信息
-m 所有项目以逗号分隔,并填满整行行宽
-n, --numeric-uid-gid 类似 -l,但列出UID 及GID 号
-N, --literal 输出未经处理的项目名称 (如不特别处理控制字符)
-o 类似 -l,但不列出有关组的信息
-p, --indicator-style=slash 对目录加上表示符号"/"
-q, --hide-control-chars print ? instead of non graphic characters
--show-control-chars show non graphic characters as-is (default
unless program is 'ls' and output is a terminal)
-Q, --quote-name enclose entry names in double quotes
--quoting-style=WORD use quoting style WORD for entry names:
literal, locale, shell, shell-always, c, escape
-r, --reverse 逆序排列
-R, --recursive 递归显示子目录
-s, --size 以块数形式显示每个文件分配的尺寸
-S 根据文件大小排序
--sort=WORD 以下是可选用的WORD 和它们代表的相应选项:
extension -X status -c
none -U time -t
size -S atime -u
time -t access -u
version -v use -u
--time=WORD 和-l 同时使用时显示WORD 所代表的时间而非修改时
间:atime、access、use、ctime 或status;加上
--sort=time 选项时会以指定时间作为排序关键字
--time-style=STYLE with -l, show times using style STYLE:
full-iso, long-iso, iso, locale, +FORMAT.
FORMAT is interpreted like 'date'; if FORMAT is
FORMAT1<newline>FORMAT2, FORMAT1 applies to
non-recent files and FORMAT2 to recent files;
if STYLE is prefixed with 'posix-', STYLE
takes effect only outside the POSIX locale
-t sort by modification time, newest first
-T, --tabsize=COLS assume tab stops at each COLS instead of 8
-u 同-lt 一起使用:按照访问时间排序并显示
同-l一起使用:显示访问时间并按文件名排序
其他:按照访问时间排序
-U 不进行排序;按照目录顺序列出项目
-v 在文本中进行数字(版本)的自然排序
-w, --width=COLS 自行指定萤幕宽度而不使用目前的数值
-x 逐行列出项目而不是逐栏列出
-X 根据扩展名排序
-1 每行只列出一个文件
--help 显示此帮助信息并退出
--version 显示版本信息并退出
SIZE is an integer and optional unit (example: 10M is 10*1024*1024). Units
are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
使用色彩来区分文件类型的功能已被禁用,默认设置和 --color=never 同时禁用了它。
使用 --color=auto 选项,ls 只在标准输出被连至终端时才生成颜色代码。
LS_COLORS 环境变量可改变此设置,可使用 dircolors 命令来设置。
退出状态:
0 正常
1 一般问题 (例如:无法访问子文件夹)
2 严重问题 (例如:无法使用命令行参数)
请向bug-coreutils@gnu.org 报告ls 的错误
GNU coreutils 的主页:<http://www.gnu.org/software/coreutils/>
GNU 软件一般性帮助:<http://www.gnu.org/gethelp/>
请向<http://translationproject.org/team/zh_CN.html> 报告ls 的翻译错误
要获取完整文档,请运行:info coreutils 'ls invocation'
root@ubuntu116:/data/gitlabData/auto_back_shell#
2.2 使用getopts实现自定义脚本的自定义选项
我们自己写脚本时也可以定义选项,提示用户如何使用,本文介绍如何使用getopts命令来处理命令选项。
2.2.1语法格式
getopts [option[:]] [DESCPRITION] VARIABLE
- option
表示为某个脚本可以使用的选项 - “:”
冒号(":") - DESCPRITION
如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION) - VARIABLE
表示将某个选项保存在变量VARIABLE中
getopts是linux系统中的一个内置变量,一般用在循环中。每当执行循环是,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项。
并将这些合法选项保存在VARIABLE这个变量中。
getopts还包含两个内置变量,及OPTARG和OPTIND
-
OPTARG
就是将选项后面的参数(或者描述信息DESCPRITION)保存在这个变量当中。 -
OPTIND
这个表示命令行的下一个选项或参数的索引(文件名不算选项或参数) -
?
getopts命令支持两种错误报告模式,详细错误报告模式和抑制错误报告模式。
在详细错误报告模式下:如果getopts检测到一个无效的选项,var的值会被设置为(?);如果getopts检测到一个后面需要跟参数的选项,后面没有参数,var的值也会被设置为(?)
在抑制错误报告模式下:如果getopts检测到一个无效的选项,var的值会被设置为(?),变量OPTARG会被设置为这个无效的选项;如果getopts检测到一个后面需要跟参数的选项,后面没有参数,var的值会被设置为(:),变量OPTARG会被设置为这个无效的选项
2.2.2 实战,编写脚本
下面的脚本qiyewechat-notifier.sh,目前只接受参数,不干实事!
#!/bin/bash
#用法提示
usage() {
echo "Usage:"
echo " qiyewechat.sh [-u USER] [-t TITLE] [-c CONTENT] [-d DETAIL] [-p PICTURE]"
echo "Description:"
echo " USER, 用户."
echo " TITLE, 标题."
echo " CONTENT, 内容."
echo " DETAIL, 细节."
echo " PICTURE, 图片."
exit -1
}
# 获取脚本执行时的选项
while getopts u:t:c:d:p: option
do
case "${option}" in
u) USER=${OPTARG};;
t) TITLE=${OPTARG};;
c) CONTENT=${OPTARG};;
d) DETAIL=${OPTARG};;
p) PICTURE=${OPTARG};;
h) usage;;
?) usage;;
esac
echo $option
echo $OPTARG
done
脚本接收不同的选项,对变量进行赋值,然后我们打印出选项和选项的值。
该脚本接受 u、t、c、d、p和h共六个不同的选项,
【u】选项的值被赋值给【USER变量】
【t】选项的值被赋值给【TITLE变量】
【c】选项的值被赋值给【CONTENT变量】
【d】选项的值被赋值给【DETAIL变量】
【u】选项的值被赋值给【USER变量】
【p】选项的值被赋值给【PICTURE变量】
【h】选项的话,则调用usage方法打印用法
2.2.3 实战,运行脚本
1、随便输入一个不存在选项
root@ubuntu116:/data/gitlabData/auto_back_shell# ./qiyewechat-notifier.sh -sjdadjsjdjsad
./qiyewechat-notifier.sh: 非法选项 -- s
Usage:
qiyewechat.sh [-u USER] [-t TITLE] [-c CONTENT] [-d DETAIL] [-p PICTURE]
Description:
USER, 用户.
TITLE, 标题.
CONTENT, 内容.
DETAIL, 细节.
PICTURE, 图片.
root@ubuntu116:/data/gitlabData/auto_back_shell#
2、输入选项 -h
root@ubuntu116:/data/gitlabData/auto_back_shell# ./qiyewechat-notifier.sh -h
./qiyewechat-notifier.sh: 非法选项 -- h
Usage:
qiyewechat.sh [-u USER] [-t TITLE] [-c CONTENT] [-d DETAIL] [-p PICTURE]
Description:
USER, 用户.
TITLE, 标题.
CONTENT, 内容.
DETAIL, 细节.
PICTURE, 图片.
您在 /var/mail/root 中有新邮件
root@ubuntu116:/data/gitlabData/auto_back_shell#
3、顺序输入完整的正确的选项
root@ubuntu116:/data/gitlabData/auto_back_shell# ./qiyewechat-notifier.sh -u 00001 -t "标题" -c “内容” -d "详情" -p “图片地址”
u
00001
t
标题
c
“内容”
d
详情
p
“图片地址”
您在 /var/mail/root 中有新邮件
root@ubuntu116:/data/gitlabData/auto_back_shell#
4、随便打乱顺序填写选项
root@ubuntu116:/data/gitlabData/auto_back_shell# ./qiyewechat-notifier.sh -u 00001 -d "详情" -p “图片地址” -t "标题" -c “内容”
u
00001
d
详情
p
“图片地址”
t
标题
c
“内容”
您在 /var/mail/root 中有新邮件
root@ubuntu116:/data/gitlabData/auto_back_shell#
三、参考链接
- https://segmentfault.com/a/1190000010171506
- https://www.cnblogs.com/AlwaysWIN/p/6088087.html
- https://blog.csdn.net/wdz306ling/article/details/79974377
- https://www.cnblogs.com/yinghao1991/p/7123550.html
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:https://blog.csdn.net/qq446282412/article/details/86493502
☞ 本人QQ: 3024665621
☞ QQ交流群: 123133153
☞ github.com/ouyangpeng
☞ oypcz@foxmail.com
更多推荐
所有评论(0)