《Linux命令行与shell脚本编程大全》第十四章 处理用户输入 (2)

 

《Linux命令行与shell脚本编程大全》第十四章 处理用户输入

14.4.2 使用getopt命令

它能够识别命令行参数,从而在脚本中解析它们。

1.命令的格式

可以接受一系列任意形式的命令行选项和参数,并自动将它们转换成命令行参数。

命令格式如下:

getopt optstring parameters

optstring:定义了命令行有效的选项字母,还定义了哪些选项字母需要参数值

 

比如:

$getopt ab:cd –a –b testb –cd test2 test3

b后面接了冒号:说明-b选项需要参数。

后面 –cd 会被自动拆分成 –c  -d 两个单独的选项

还会插入双破折线来分割行中的额外参数。

 

《Linux命令行与shell脚本编程大全》第十四章 处理用户输入

2.在脚本中使用getopt

可以在脚本中使用getopt来格式化脚本所携带的任何命令行选项或者参数,用起来略繁琐。

方法是:用getopt命令生成的格式化后的版本来替换已有的命令行参数和选项。

用set命令可以做到。需要的选项之一就是 双破折号 --。它会将命令行参数替换成set命令的命令行值。

但是这个不擅长处理带空格和带引号的参数值,它会将空格当做参数分隔符,而不是根据双引号将二者当做一个参数

例子:

  1 #!/bin/bash

  2 echo

  3 set -- $(getopt -q ab:cd: "$@")

  4 while [ -n "$1" ]

  5 do

  6         case "$1" in

  7         -a) echo "Found the -a option";;

  8         -b) value=$2

  9                 echo "Found the -b option, Param = $value"

 10                 shift;;

 11         -c) echo "Found the -c option";;

 12         -d) value=$2

 13                 echo "Found the -d option, Param = $value"

 14                 shift;;

 15         --) shift

 16                 break;;

 17         *) echo "$1 is not option";;

 18         esac

 19         shift

 20 done

 21

 22 count=1

 23 for param in $@

 24 do

 25         echo "Param$count = $param"

 26         count=$[ $count + 1 ]

 27 done

运行:

 

《Linux命令行与shell脚本编程大全》第十四章 处理用户输入

3. 使用更高级的getopts

getopt将命令行上选项和参数的处理结后只生成一个输出。

getopts能够和已有的shell参数变量配合默契。

 

每次调用它时,它一次只处理命令行上检测到的一个参数。处理完所有的参数后,会退出并返回一个大于0的退出状态码。这样就可以循环了。

格式如下:

getopts optstring variable

如果选项有参数就在后面加冒号

要去掉错误消息就在前面加冒号。

 

getopts会用到两个环境变量:

OPTARG:会保存一个参数值

OPTIND:保存参数列表中getopts正在处理的参数位置。

 

getopts知道何时停止处理选项,并且把参数留给你处理。

每处理一个选项,OPTIND就会增1,处理完选项时就可以用shift来移动参数。从而处理参数。

例子:

  1 #!/bin/bash

  2 echo

  3 while getopts :ab:c opt

  4 do

  5         case "$opt" in

  6         a) echo "Found -a option";;

  7         b) echo "Found -b option, with value:$OPTARG";;

  8         c) echo "Found -c option";;

  9         *) echo "Unkonw option: $opt"

 10         esac

 11 done

 12

 13 echo

 14 echo "OPNTING = $OPTIND"

 15 shift $[ $OPTIND - 1 ]  #这里开始处理参数,先移动参数

 16 count=1

 17 for param in "$@"

 18 do

 19         echo "Param$count = $param"

 20         count=$[ $count + 1 ]

 21 done

运行:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygfdy.html