在linux中编写脚本.为了使脚本更加智能化,经常需要设置参数.
我们常用到是位置参数: $1 $2 $3.......$* 和 $@
这样可以很大程度上提高脚本的功能是使用范围.但是还是有局限.
如:
参数格式不能变
参数位置顺序不能变
参数数量不灵活
.......
注:这里说的不能.不是绝对的不能.不要钻这个牛角.因为这不是重点.
为了解决上面的缺陷.这里说说bash中的getopts
getopts提供了linux命令类似的参数功能.如:
test.sh -a *** -b *** -c ***
参数a b c 的位置可以交换.
下面来个示例:
脚本test.sh的内容如下:
######################## BEGIN ########################
#!/bin/bash
while getopts "a:b:c:" optname
do
case "$optname" in
"a")
echo "a $OPTARG"
;;
"b")
echo "b $OPTARG"
;;
"c")
echo "c $OPTARG"
;;
esac
done
####################### END ##############################
现在试试
./test.sh -b bbbb -a aaa -c ccc
示例解释:
while循环开始,然后getopts定义了三个参数 a b c并赋值给$optname
进入循环后,开始case.如果$optname为a.(也就是说有-a 参数)执行echo "a $OPTARG".这里的$OPTARG为-a 后面跟的值.
如果$optname为b(也就是说有-b 参数)执行echo "b $OPTARG".这里的$OPTARG为-b 后面跟的值.
如此......................................
再深入点解释getopts "a:b:c:" 部分.
这里定义有三个参数. -a -b -c
a后面的冒号意思是.-a参数后面需要带一个值
b后面的冒号也是一个意思.c亦如此.
如果出现这样的: getopts "a:b:c:d"
d后面没有冒号.那么-d就是一个开关型参数.什么是开关型参数?就是要么开,要么关.没有半开不关的状态.也就是要么真要么假.
例如,要实现这样一个功能.加-d参数就把一段信息打印到屏幕.不加就不打印.
现在已经定义有四个参数了.如果我在运行脚本的时候.不小心多写或者错写一个参数
如:./test.sh -a *** -k ****
明明没有定义-k参数.那么bash要骂人了.一堆JJYY的话就出来了.
要去掉这些JJYY的话怎么弄?
好办.
getopts ":a:b:c:"
在所有参数前面多写一个:就可以了.
最后再写一个简单的示例:(和上面的差不多一样的功能.但是稍为不一样.我觉得对比一下更容易理解)
#############################BEGIN###########################
#!/bin/bash
while getopts ":a:b:c:" optname; do
case $optname in
a) a=$OPTARG;;
b) b=$OPTARG;;
c) c=$OPTARG;;
?|*) echo NUll.;;
esac
done
echo "A $a:"
echo "B = $b"
echo "C = $c"
#############################END###########################