前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这样处理shell脚本参数,爽多了!

这样处理shell脚本参数,爽多了!

作者头像
编程珠玑
发布2020-05-18 23:43:11
20.7K1
发布2020-05-18 23:43:11
举报
文章被收录于专栏:编程珠玑编程珠玑

在《shell必备基础知识》中说到了一些入口参数的基本使用:

代码语言:javascript
复制
/home/shouwang/test.sh para1 para2 para3
$0                      $1    $2    $3
脚本名              第一个参数      第三个参数

有什么不方便之处?

看到这里,你可能觉得没什么,这不是学Shell都知道的知识吗?

但是你有没有觉得这样使用参数有这样的问题

  • 要知道参数的顺序,确定每一个位置的参数是什么含义
  • 不能随意调换位置
  • 使用第三个参数,必须要有第一个,第二个参数

下面简单示例说明一下。

参数顺序固定

代码语言:javascript
复制
#!/usr/bin/env bash
#test.sh
echo "para1 $1"
echo "para2 $2"
echo "para3 $3"

这个脚本程序很简单,只是输出第一二三个参数:

代码语言:javascript
复制
$ ./test.sh 1 2 3
para1 1
para2 2
para3 3

你看,这样para1对应第一个参数,如果位置调换了,就变了:

代码语言:javascript
复制
$ ./test 1 3 2
para1 1
para2 3
para3 2

只要顺序一变,参数就对应不上了。假设你有时候不需要第二个参数,要使用第三个参数,你是不是还必须得输入第二个参数?

优雅地处理shell参数

铺垫了这么多,本文到底想介绍什么呢?

实际上这种形式你已经接触过很多了。对于写的程序,我已经在《如何优雅地处理命令行参数》中介绍过了,你在使用linux命令的时候想必也已经领略了,例如:

代码语言:javascript
复制
$ find -name "filename"

用-name参数指定要查找的文件名,而不是说第一个参数是文件名,第二个参数是xxx。

那么shell脚本如何像这样将参数当成选项来处理呢?实际上都是类似的,看下面的例子:

代码语言:javascript
复制
#!/usr/bin/env bash
# -n 名称
# -a 作者
# -h 帮助
while getopts ":n:a:h" optname
do
    case "$optname" in
      "n")
        echo "get option -n,value is $OPTARG"
        ;;
      "q")
        echo "get option -a ,value is $OPTARG"
        ;;
      "h")
        echo "get option -h,eg:./test.sh -n 编程珠玑 -a 守望先生"
        ;;
      ":")
        echo "No argument value for option $OPTARG"
        ;;
      "?")
        echo "Unknown option $OPTARG"
        ;;
      *)
        echo "Unknown error while processing options"
        ;;
    esac
    #echo "option index is $OPTIND"
done

解释一下:

  • 有两个预先定义的变量,OPTARG表示选项值,OPTIND表示参数索引位置,类似于前面提到$1。
  • n后面有:,表示该选项需要参数,而h后面没有:,表示不需要参数
  • 最开始的一个冒号,表示出现错误时保持静默,并抑制正常的错误消息

我们试一下效果:

代码语言:javascript
复制
$ ./test.sh -a
No argument value for option a
$ ./test.sh -h
get option -h,eg:./test.sh -n 编程珠玑 -a 守望先生
$ ./test.sh -n 编程珠玑 -a 守望先生
get option -a ,value is 守望先生

你看这样使用参数,不需要管参数的位置,并且参数还是可选,互不干扰。

总结

以这样的方式处理参数,使得脚本的参数扩展性和可读性都要好,对于支持丰富输入参数的脚本,不妨考虑本文。对于自己编写的C/C++小工具,参考《如何优雅地处理命令行参数

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 有什么不方便之处?
  • 参数顺序固定
  • 优雅地处理shell参数
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档