前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在bash中使用getopts [参数解析工具]

如何在bash中使用getopts [参数解析工具]

作者头像
程序熵
发布2024-06-18 15:21:24
650
发布2024-06-18 15:21:24
举报
文章被收录于专栏:技术汇技术汇

问题

我想以这种方式调用我的脚本文件:

代码语言:javascript
复制
$ ./myscript -s 45 -p any_string

或者

代码语言:javascript
复制
$ ./myscript -h  #should display help
$ ./myscript     #should display help

我的需求是:

  • 在这里使用 getopts 获取输入参数。
  • 检查是否存在 -s 参数,如果不存在则返回错误。
  • 检查 -s 后面的值是否为 45 或 90。
  • 检查是否存在 -p 参数,并且其后有一个输入字符串。
  • 如果用户输入 ./myscript -h 或者只输入 ./myscript,则显示帮助信息。

到目前为止,我尝试了这段代码:

代码语言:javascript
复制
#!/bin/bash
while getopts "h:s:" arg; do
  case $arg in
    h)
      echo "usage" 
      ;;
    s)
      strength=$OPTARG
      echo $strength
      ;;
  esac
done

但是用那段代码会出错。如何在 Bash 中使用 getopts


回答

原始代码的问题是:

  • h: 预期会有参数,但实际上不应该有,需要将其改成 h(去掉冒号)。
  • 期望得到 -p any_string,需要将 p: 添加到参数列表中。

冒号 : 在选项之后意味着它需要参数。

按提问者需求,可以使用如下代码:

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

usage() { echo "Usage: $0 [-s <45|90>] [-p <string>]" 1>&2; exit 1; }

while getopts ":s:p:" o; do
    case "${o}" in
        s)
            s=${OPTARG}
            ((s == 45 || s == 90)) || usage
            ;;
        p)
            p=${OPTARG}
            ;;
        *)
            usage
            ;;
    esac
done
shift $((OPTIND-1))

if [ -z "${s}" ] || [ -z "${p}" ]; then
    usage
fi

echo "s = ${s}"
echo "p = ${p}"

示例运行:

代码语言:javascript
复制
$ ./myscript.sh
Usage: ./myscript.sh [-s <45|90>] [-p <string>]

$ ./myscript.sh -h
Usage: ./myscript.sh [-s <45|90>] [-p <string>]

$ ./myscript.sh -s "" -p ""
Usage: ./myscript.sh [-s <45|90>] [-p <string>]

$ ./myscript.sh -s 10 -p foo
Usage: ./myscript.sh [-s <45|90>] [-p <string>]

$ ./myscript.sh -s 45 -p foo
s = 45
p = foo

$ ./myscript.sh -s 90 -p bar
s = 90
p = bar

参考

  • stackoverflow question 16483119
  • help getopts
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 回答
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档