linux bash参数

 

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.如果$optnamea.(也就是说有-a 参数)执行echo "a $OPTARG".这里的$OPTARG-a 后面跟的值.

如果$optnameb(也就是说有-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###########################