Case...esac 默认条件

Jos*_*osh 0 bash

我第一次使用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
Run Code Online (Sandbox Code Playgroud)

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

$ ./test.sh -c
getopts saw ? with value c and went to *
script done
Run Code Online (Sandbox Code Playgroud)

所有这些都完全一样吗?

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

  • ?\?[?]相同呢?
  • *不必要的吗?

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

Bar*_*mar 5

Only*是 的默认值case

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

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