首页 > 解决方案 > 案例...esac 默认条件

问题描述

我第一次使用getoptscase...esac。我已经看到教程和问题有许多不同模式的默认/全能选项:?, *, \?, [?]. 它们的功能似乎都相同,您可以在此脚本中更改它们的顺序:

#!/bin/bash
set -e
set -u
set -o pipefail

while getopts ":d:l:h:" opt; do
    case $opt in
        d)  echo getopts saw $opt with value $OPTARG ;;
        l)  echo getopts saw $opt with value $OPTARG ;;
        h)  echo getopts saw $opt with value $OPTARG ;;
        :)  echo "getopts saw $opt with value $OPTARG and went to :" ;;
        *)  echo "getopts saw $opt with value $OPTARG and went to *" ;;
        ?)  echo "getopts saw $opt with value $OPTARG and went to ?" ;;
        \?) echo "getopts saw $opt with value $OPTARG and went to \?" ;;
        [?]) echo "getopts saw $opt with value $OPTARG and went to [?]" ;;
    esac
done
echo script done

运行下面的代码将始终在case列表中的第一个匹配选项处停止:

$ ./test.sh -c
getopts saw ? with value c and went to *
script done

所有这些都完全相同吗?

回应@BenjaminW. 的评论:下面的手动引用解释了getopts将返回?vs:取决于是否getopts设置为静默。所以我修改后的问题是:

从手册中:如果未找到所需的参数,并且 getopts 不是静默的,则在名称中放置一个问号 ('?'),未设置 OPTARG,并打印一条诊断消息。如果 getopts 是静默的,则在 name 中放置一个冒号 (':'),并将 OPTARG 设置为找到的选项字符。

标签: bash

解决方案


只有*是 的默认值case

其他人在此脚本中工作的原因是因为您正在处理getopts结果。它为参数中未列出的任何选项设置$opt为,并且您已经明确处理了所有这些选项。?getopts

但是,如果您正在处理更一般的数据,您将无法?用作默认情况。


推荐阅读