你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

优雅地处理shell参数

[复制链接]
gaosmile 发布时间:2020-8-12 20:58
在《shell必备基础知识》中说到了一些入口参数的基本使用:
/home/shouwang/test.sh para1 para2 para3
$0                      $1    $2    $3
脚本名              第一个参数      第三个参数

有什么不方便之处?
看到这里,你可能觉得没什么,这不是学Shell都知道的知识吗?
但是你有没有觉得这样使用参数有这样的问题
  • 要知道参数的顺序,确定每一个位置的参数是什么含义
  • 不能随意调换位置
  • 使用第三个参数,必须要有第一个,第二个参数

下面简单示例说明一下。
参数顺序固定#!/usr/bin/env bash
#test.sh
echo "para1 $1"
echo "para2 $2"
echo "para3 $3"

这个脚本程序很简单,只是输出第一二三个参数:
$ ./test.sh 1 2 3
para1 1
para2 2
para3 3

你看,这样para1对应第一个参数,如果位置调换了,就变了:
$ ./test 1 3 2
para1 1
para2 3
para3 2

只要顺序一变,参数就对应不上了。假设你有时候不需要第二个参数,要使用第三个参数,你是不是还必须得输入第二个参数?
优雅地处理shell参数
铺垫了这么多,本文到底想介绍什么呢?
实际上这种形式你已经接触过很多了。对于写的程序,我已经在《如何优雅地处理命令行参数》中介绍过了,你在使用linux命令的时候想必也已经领略了,例如:
$ find -name "filename"
用-name参数指定要查找的文件名,而不是说第一个参数是文件名,第二个参数是xxx。
那么shell脚本如何像这样将参数当成选项来处理呢?实际上都是类似的,看下面的例子:
#!/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后面没有:,表示不需要参数
  • 最开始的一个冒号,表示出现错误时保持静默,并抑制正常的错误消息

我们试一下效果:
$ ./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 守望先生

你看这样使用参数,不需要管参数的位置,并且参数还是可选,互不干扰。
总结
以这样的方式处理参数,使得脚本的参数扩展性和可读性都要好,对于支持丰富输入参数的脚本,不妨考虑本文。
收藏 评论0 发布时间:2020-8-12 20:58

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版