AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 426483
Accepted
Tim
Tim
Asked: 2018-02-26 08:15:19 +0800 CST2018-02-26 08:15:19 +0800 CST 2018-02-26 08:15:19 +0800 CST

getopts 的选项字符串的第一个字符是:(冒号)的目的是什么?

  • 772

在使用时的选项字符串中getopts,来自http://wiki.bash-hackers.org/howto/getopts_tutorial

如果选项字符串的第一个字符是 :(冒号),这通常是无意义的,因为它前面没有选项字母,getopts 切换到“静默错误报告模式”。在生产性脚本中,这通常是您想要的,因为它允许您自己处理错误而不会被烦人的消息干扰。

我想知道以下是什么意思:

  • “静默报错模式”

  • “它允许您自己处理错误而不会被烦人的消息打扰”?

你能举一些例子吗?

bash getopts
  • 2 2 个回答
  • 8689 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2018-02-26T08:30:09+08:002018-02-26T08:30:09+08:00

    如果 的第一个字符optstring是冒号,getopts则不会为缺少选项参数或无效选项生成任何诊断消息。

    如果您确实需要对脚本生成的诊断消息进行更多控制,或者如果用户提供了不稳定的命令行选项,您只是不希望任何内容出现在标准错误流中,这可能会很有用。

    在静默报告模式下(带有初始:),如果您想提醒用户一个无效的选项,您将不得不?在传递给 的变量中查找getopts。同样,对于缺少选项参数,它是一个:. 这两个错误通常由getopts它自己处理,但要向用户报告您自己的错误,您需要分别捕获这些错误,以便能够给出正确的诊断消息。

    在非静默报告模式下,getopts对标准错误进行自己的错误报告,您只需捕获*“任何错误”即可。

    比较这两个例子:

    #!/bin/bash
    
    while getopts 'a:b:' opt; do
        case "$opt" in
            a) printf 'Got a: "%s"\n' "$OPTARG" ;;
            b) printf 'Got b: "%s"\n' "$OPTARG" ;;
            *) echo 'some kind of error' >&2
               exit 1
        esac
    done
    

    该*案例捕获任何类型的命令行解析错误。

    $ bash script.sh -a
    script.sh: option requires an argument -- a
    some kind of error
    $ bash script.sh -c
    script.sh: illegal option -- c
    some kind of error
    
    #!/bin/bash
    
    while getopts ':a:b:' opt; do
        case "$opt" in
            a)  printf 'Got a: "%s"\n' "$OPTARG" ;;
            b)  printf 'Got b: "%s"\n' "$OPTARG" ;;
            :)  echo 'missing argument!' >&2
                exit 1 ;;
            \?) echo 'invalid option!' >&2
                exit 1
        esac
    done
    

    上面的:案例捕获缺少参数错误,而?案例捕获无效选项错误(请注意,?需要转义或引用以匹配文字?,否则它会匹配任何单个字符)。

    $ bash script.sh -a
    missing argument!
    $ bash script.sh -b
    missing argument!
    $ bash script.sh -c
    invalid option!
    
    • 13
  2. ilkkachu
    2018-02-26T08:28:52+08:002018-02-26T08:28:52+08:00

    非静音,getopts打印错误消息:

    $ bash -c 'getopts a opt' getopts_test -b
    getopts_test: illegal option -- b
    

    静音,getopts不会自行打印:

    $ bash -c 'getopts :a opt' getopts_test -b
    $
    

    因此,使用冒号表示静默模式,我们可以按照我们喜欢的方式在脚本中打印我们自己的错误,而不是固定的消息:

    #!/bin/bash
    while getopts :a opt; do
        [[ $opt = "?" ]] && echo "Invalid option character '$OPTARG'" >&2;
    done
    
    • 2

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve