【Linux学习】Shell命令行参数解析工具getopts是如何使用的?

一、学习背景

最近通过python实现了发送消息给企业微信的功能,参考链接:

但是并不是每台Linux服务器上都有合适的python版本,之前这个python脚本是运行在Python 2环境下的,但是可能新的Linux服务器上装的是Python 3 之类的,因此可能写一个Shell脚本更加通用,因此我准备来写个Shell脚本来实现发送消息给企业微信。

但是写好的脚本都是需要传入参数的,因此学习一下Shell命令行参数解析工具getopts是如何使用的?

其实上一篇文章中我已经有描述了getopts的用法,现在来学习一下。

之前有一篇文章介绍了

二、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://blog.csdn.net/qq446282412/article/details/86493502
☞ 本人QQ: 3024665621
☞ QQ交流群: 123133153
github.com/ouyangpeng
oypcz@foxmail.com


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节卷动

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值