Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。本文主要介绍Linux getopt 命令。

 1、命令简介

getopt:用于解析命令行选项,检测给定的选项是否合法。

2、命令用法

getopt [options] [--] optstring parameters

getopt [options] -o|--options optstring [options] [--] parameters

3、命令描述

getopt用于分解(解析)命令行中的选项,以便shell过程进行解析,并检查合法选项。

调用getopt的参数可以分为两部分:修改getopt解析方式的选项(options和-o|--options optstring在SYNOPSIS中),以及要解析的参数(SYNOPSIS中的参数)。第二部分将从不是选项参数的第一个非选项形参开始,或者在'--'第一次出现之后开始。如果在第一部分中没有找到' -o '或'--options '选项,则第二部分的第一个参数将用作短选项字符串。

如果设置了环境变量GETOPT_COMPATIBLE,或者如果它的第一个参数不是一个选项(不是以' - '开头,这是SYNOPSIS中的第一种格式),getopt将生成与getopt的其他版本兼容的输出。它仍然会进行参数变换并识别可选参数。

getopt的传统实现无法处理参数和非选项参数中的空格和其他(特定于shell的)特殊字符。为了解决这个问题,这个实现可以生成带引号的输出,shell必须再次解释该输出(通常使用eval命令)。这样可以保留这些字符,但是必须以与其他版本(SYNOPSIS中的第二种或第三种格式)不再兼容的方式调用getopt。要确定是否安装了getopt的增强版本,可以使用一个特殊的测试选项(-T)。

4、命令选项

选项

说明

-a, --alternative

允许长选项以一个 ’-‘ 开头。

-h, --help

输出一个小的使用指南并成功退出。

没有生成其他输出。

-l, --longoptions longopts

要识别的长(多字符)选项。

通过用逗号分隔名称,

可以同时指定多个选项名称。

这个选项可以被给出

不止一次longopts是累积的。

中的每个长选项名

longopts可以后面跟着一个冒号,

表示它有一个必需的参数,

后面跟着两个冒号,

表示它有一个可选的参数。

-n, --name progname

getopt常规在报告错误时将使用的名称。

注意,getopt的错误仍然被报告为来自getopt。

-o, --options shortopts

要识别的短(单字符)选项。如果没有找到该选项,

则使用getopt的第一个不以' - '开头的参数

(也不是选项参数)作为短选项字符串。

在shortopts中,

每个短选项字符后面可以跟着一个冒号,

表示它有一个必选参数,后面可以跟着两个冒号,

表示它有一个可选参数。

短消息的第一个字符可能是' + '或' - ',

以影响选项解析和输出生成的方式。

-q, --quiet

禁用getopt错误报告。

-Q, --quiet-output

不生成正常输出。getopt仍然会报告错误,

除非还使用-q。

-s, --shell shell

将引用约定设置为shell的引用约定。

如果没有找到-s参数,则使用BASH约定。

有效参数目前是' sh ' ' bash ', ' csh '和' tcsh '。

-u, --unquoted

不要引用输出。

注意,空格和特殊(依赖于shell的)字符

可能在此模式中造成严重破坏

(就像其他getopt实现一样)。

-T --test

测试getopt是增强版本还是旧版本。

这不会产生任何输出,

并将错误状态设置为4。

getopt的其他实现

(如果设置了环境变量GETOPT_COMPATIBLE)

将返回'--',错误状态为0。

-V, --version

输出版本信息并退出。没有生成其他输出。

5、使用示例

使用 -o-l 时,双破折线不能用在optstring前面,需要写在optstring之后(如第三种写法)
getopt命令报错时会继续执行后面的代码,实际使用时需要使用 $? 判断命令执行结果进行处理( 将getopt与eval、set分离处理)。

例如,

!/bin/bash
#eval set -- $(getopt -- a:b:s:u "$@")
cmd_getopt=$(getopt -n $0 -o m::f:: -l mark::,file:: -- "$@")
[ $? -ne 0 ] && exit 1
eval set -- "$cmd_getopt"

while [ "$1" ];do
  case $1 in
    -m|--mark)
      mark="$2"
      shift 2;;
    -f|--file)
      file="$2"
      shift 2;;
    --)
      shift
      break;;
    *)
    echo "Usage [-m|-f] operate"
    exit 1;;
  esac
done
# 查看结果,可根据实际场景调用case中定义的变量
echo mark -- $mark
echo file -- $file

推荐文档