|
在《shell必备基础知识》中说到了一些入口参数的基本使用: /home/shouwang/test.sh para1 para2 para3$0 $1 $2 $3* ~! O2 ]) a# v: r, U 脚本名 第一个参数 第三个参数# N- p2 p5 v/ I$ ?; z 有什么不方便之处? 看到这里,你可能觉得没什么,这不是学Shell都知道的知识吗? 但是你有没有觉得这样使用参数有这样的问题
下面简单示例说明一下。 参数顺序固定#!/usr/bin/env bash#test.sh: l9 E) a8 q* d1 z: G; A7 E0 r echo "para1 $1" echo "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" Kpara1 1 para2 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' Rpara1 14 f# Q8 _/ d) O para2 3 para3 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# -n 名称 # -a 作者 # -h 帮助 while getopts ":n:a:h" optname do7 s1 A/ { l. s0 F& e1 x case "$optname" in' n( e& `$ y' G9 P; X+ s "n") echo "get option -n,value is $OPTARG"7 U( I3 _: b, Q" a4 A$ R. G m ;; "q") echo "get option -a ,value is $OPTARG" ;;3 ?. \- ^, K2 _$ s5 H' _ "h") echo "get option -h,eg:./test.sh -n 编程珠玑 -a 守望先生" K( c( ^. r( l- T7 C ;; ":") echo "No argument value for option $OPTARG" ;; "?") echo "Unknown option $OPTARG"- B5 {+ {$ r" g, M ;; *)1 ~6 X" k5 C; @/ L& c" n echo "Unknown error while processing options" ;;# l' s4 O% v' }9 q B' G esac #echo "option index is $OPTIND" done 解释一下:
我们试一下效果: $ ./test.sh -a, K y( F6 h; S4 [ GNo argument value for option a $ ./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 守望先生 你看这样使用参数,不需要管参数的位置,并且参数还是可选,互不干扰。 总结以这样的方式处理参数,使得脚本的参数扩展性和可读性都要好,对于支持丰富输入参数的脚本,不妨考虑本文。 |
微信公众号
手机版