“?”,与 *

“?”,与 *

一个 stackoverflow 帖子有一个用于处理命令行参数的模板。

该测试是否[ $# == 0 ]意味着 bash 脚本不应在没有任何参数的情况下运行?作为模板,我认为脚本通常不一定需要任何参数。

case声明中,这两种情况有什么不同*)"?")他们看起来是一样的。

# --- Options processing -------------------------------------------
if [ $# == 0 ] ; then
    echo $USAGE
    exit 1;
fi

while getopts ":i:vh" optname
  do
    case "$optname" in
      "v")
        echo "Version $VERSION"
        exit 0;
        ;;
      "i")
        echo "-i argument: $OPTARG"
        ;;
      "h")
        echo $USAGE
        exit 0;
        ;;
      "?")
        echo "Unknown option $OPTARG"
        exit 0;
        ;;
      ":")
        echo "No argument value for option $OPTARG"
        exit 0;
        ;;
      *)
        echo "Unknown error while processing options"
        exit 0;
        ;;
    esac
  done

shift $(($OPTIND - 1))

param1=$1
param2=$2

答案1

该脚本至少需要一个参数,如果没有,它会显示使用信息。它应该echo $USAGE >&2这样做,因为这是一个错误。其他脚本可能使用零参数,因此您必须进行修改。就像有些人不接受这种争论一样i

“?”,与 *

是的,它们是不同的:

  • "?"说要找一个?。这是 getopts 在找到不期望的选项(无效选项)时返回的结果。
  • *对案例说,如果您找不到其他匹配项,则执行此操作。这不应该发生,但也有可能发生。它可能表明 getopts 中存在错误,或更可能是您的程序存在错误(请参阅防御性编程)。

答案2

它们应该是相同的。

然而,该代码也有其自身的问题:

  • 未能引用算术扩展;应该shift "$(($OPTIND - 1))"
  • ==不可移植运算符的使用
  • 写入标准输出的错误消息
  • 如果出现错误,则以 0(成功)状态退出
  • 未能引用变量;应该是"$#"并且echo "$USAGE"
  • if-no-arguments 检查放置不当;它应该是getopts 循环,以免被愚弄script --
  • 无用的引用vhi:i:vh

相关内容