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

优雅地处理shell参数

[复制链接]
gaosmile 发布时间:2020-8-12 20:58
在《shell必备基础知识》中说到了一些入口参数的基本使用:
/home/shouwang/test.sh para1 para2 para3
7 ?1 K6 k, V2 j& \: c5 w% b$0                      $1    $2    $3* ~! O2 ]) a# v: r, U
脚本名              第一个参数      第三个参数
# N- p2 p5 v/ I$ ?; z
有什么不方便之处?
看到这里,你可能觉得没什么,这不是学Shell都知道的知识吗?
但是你有没有觉得这样使用参数有这样的问题
  • 要知道参数的顺序,确定每一个位置的参数是什么含义
  • 不能随意调换位置
  • 使用第三个参数,必须要有第一个,第二个参数

    . I/ V- q* e6 w3 ]9 ~
下面简单示例说明一下。
参数顺序固定#!/usr/bin/env bash
5 _  f3 F& Q( w" E) {1 {3 i% i$ L* P#test.sh: l9 E) a8 q* d1 z: G; A7 E0 r
echo "para1 $1"
1 N  n  Y0 H3 jecho "para2 $2"8 ?) R# Y! j; T( C1 u  X
echo "para3 $3"
* k( |3 }& l2 K& _7 s0 ?( \9 b* ~- S
这个脚本程序很简单,只是输出第一二三个参数:
$ ./test.sh 1 2 3* [! S5 O$ e1 G' ?% F" K
para1 1
8 n9 G" C4 q! A" T& kpara2 2# n/ s4 M5 c# n( e6 @  x
para3 3
% R3 `, Z2 n. H& G" s4 n6 T' [
你看,这样para1对应第一个参数,如果位置调换了,就变了:
$ ./test 1 3 2% x: r  p  b& w. [' e' R
para1 14 f# Q8 _/ d) O
para2 3
0 O- H* K6 ]8 s0 b/ N' b! Kpara3 2
% i; b" z' o, ^$ G9 A
只要顺序一变,参数就对应不上了。假设你有时候不需要第二个参数,要使用第三个参数,你是不是还必须得输入第二个参数?
优雅地处理shell参数
铺垫了这么多,本文到底想介绍什么呢?
实际上这种形式你已经接触过很多了。对于写的程序,我已经在《如何优雅地处理命令行参数》中介绍过了,你在使用linux命令的时候想必也已经领略了,例如:
$ find -name "filename") H* o' H1 L1 E8 ^- O; ]! d4 J* f
用-name参数指定要查找的文件名,而不是说第一个参数是文件名,第二个参数是xxx。
那么shell脚本如何像这样将参数当成选项来处理呢?实际上都是类似的,看下面的例子:
#!/usr/bin/env bash
4 C! k% G' C) z$ C9 H4 d# -n 名称
' k! ~$ J3 n4 m# a# K- Y) ]! g# -a 作者
9 I) Q' O, r# W5 b# -h 帮助
/ T; M3 s' l1 Z; J3 ^0 p9 h+ l# iwhile getopts ":n:a:h" optname
6 B4 t7 O- s0 Udo7 s1 A/ {  l. s0 F& e1 x
    case "$optname" in' n( e& `$ y' G9 P; X+ s
      "n")
& B3 D* O5 c9 f5 q9 Z: c        echo "get option -n,value is $OPTARG"7 U( I3 _: b, Q" a4 A$ R. G  m
        ;;
  I- i$ }3 q. F8 G  a* q3 Y      "q")
  ~8 C, z) U  _" e: \        echo "get option -a ,value is $OPTARG"
! O7 [. d& }. i) y        ;;3 ?. \- ^, K2 _$ s5 H' _
      "h")
6 l( m6 Q5 h5 W# p& O        echo "get option -h,eg:./test.sh -n 编程珠玑 -a 守望先生"  K( c( ^. r( l- T7 C
        ;;
" O/ T5 l0 \/ I$ b$ ~      ":")
9 @/ F  x; {: _3 }% V, j6 ?' j        echo "No argument value for option $OPTARG"
( [# l" K5 x% d  w/ l& C# g        ;;
8 o5 {7 R! t5 Y. |  U- B1 h      "?")
+ k# ~/ o# m: r  c- c        echo "Unknown option $OPTARG"- B5 {+ {$ r" g, M
        ;;
2 R- r, Y2 n9 E' Q      *)1 ~6 X" k5 C; @/ L& c" n
        echo "Unknown error while processing options"
/ E  ~& r+ F  r8 d1 A, Q! K4 _9 O        ;;# l' s4 O% v' }9 q  B' G
    esac
; e+ d) w, ~; g1 ]* d    #echo "option index is $OPTIND"
) ?1 i5 J  H7 `9 _done

) z7 M  _" Z" I; A( K/ ~; E
解释一下:
  • 有两个预先定义的变量,OPTARG表示选项值,OPTIND表示参数索引位置,类似于前面提到$1。
  • n后面有:,表示该选项需要参数,而h后面没有:,表示不需要参数
  • 最开始的一个冒号,表示出现错误时保持静默,并抑制正常的错误消息
    2 _6 z5 m1 i- W& F
我们试一下效果:
$ ./test.sh -a, K  y( F6 h; S4 [  G
No argument value for option a
! B8 a) o( R2 b; N% Y: e& @+ P! p$ ./test.sh -h0 \- F/ G! o7 J- H9 @
get option -h,eg:./test.sh -n 编程珠玑 -a 守望先生9 z& x/ D& q9 a$ m: T8 X
$ ./test.sh -n 编程珠玑 -a 守望先生" ^/ [0 e  g* H3 ^! y8 w. L# \7 S
get option -a ,value is 守望先生

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

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版