首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自getopts的意外行为

来自getopts的意外行为
EN

Unix & Linux用户
提问于 2019-06-28 04:00:54
回答 1查看 530关注 0票数 3

考虑到:

代码语言:javascript
复制
#!/bin/sh

while getopts ":h" o; do
  case "$o" in
    h )
    "Usage:
    sh $(basename "$0") -h      Displays help message
    sh $(basename "$0") arg     Outputs ...

     where:
    -h   help option
        arg  argument."
    exit 0
    ;;
    \? )
    echo "Invalid option -$OPTARG" 1>&2
    exit 1
    ;;
    : )
    echo "Invalid option -$OPTARG requires argument" 1>&2
    exit 1
    ;;
  esac
done

这个调用返回not found为什么?

代码语言:javascript
复制
$ sh getopts.sh -h
getopts.sh: 12: getopts.sh: Usage:
    sh getopts.sh -h        Displays help message
    sh getopts.sh arg   Outputs ...

     where:
    -h   help option
        arg  argument.: not found

这样就行了:

代码语言:javascript
复制
$ sh getopts.sh arg

对于这个选项,我期望“无效选项”:

代码语言:javascript
复制
$ sh getopts.sh

这样就行了:

代码语言:javascript
复制
$ sh getopts.sh -s x
Invalid option -s
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-06-28 04:03:41

您似乎错过了打印消息,而是将整个字符串作为要运行的命令传递。在字符串之前添加一个echo

代码语言:javascript
复制
case "$o" in
  h )
  echo "Usage:
  sh $(basename "$0") -h      Displays help message
  sh $(basename "$0") arg     Outputs ...

   where:
  -h   help option
      arg  argument."
  exit 0
  ;;

但是,通常更倾向于使用一种样式来添加heredoc,而不是将多行字符串打印为

代码语言:javascript
复制
show_help() {
cat <<'EOF'
Usage:
    sh $(basename "$0") -h      Displays help message
    sh $(basename "$0") arg     Outputs ...

     where:
    -h   help option
        arg  argument.
EOF
}

并使用函数show_help作为-h标志。

对于空参数标志,对getopts()的第一次调用退出循环,因此在循环中不能有句柄。在调用getopts()之前对空参数进行泛型检查

代码语言:javascript
复制
if [ "$#" -eq 0 ]; then
    printf 'no argument flags provided\n' >&2
    exit 1
fi

使用前面对参数标志:h的定义,建议-h不使用任何参数。子句:)仅适用于定义-h以接受参数时,即定义为:h:时。只有在不传递参数的情况下运行它,:)下的代码才会被执行。把整个剧本拼凑起来

代码语言:javascript
复制
#!/usr/bin/env bash

if [ "$#" -eq 0 ]; then
    printf 'no argument flags provided\n' >&2
    exit 1
fi

show_help() {
cat <<'EOF'
Usage:
    sh $(basename "$0") -h      Displays help message
    sh $(basename "$0") arg     Outputs ...

     where:
    -h   help option
        arg  argument.
EOF
}

while getopts ":h:" opt; do
  case "$opt" in
    h )
    show_help
    exit 1
    ;;
    \? )
    echo "Invalid option -$OPTARG" 1>&2
    exit 1
    ;;
    : )
    echo "Invalid option -$OPTARG requires argument" 1>&2
    exit 1
    ;;
  esac
done

现在就运行它

代码语言:javascript
复制
$ bash script.sh 
no argument flags provided
$ bash script.sh -h
Invalid option -h requires argument
$ bash script.sh -s
Invalid option -s
票数 5
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/527385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档