++++++SHELL++++
查看一个文件的信息
1) type (getopts/getopt 一个是shell内建,一个是外部的小程序)
type getopts (shell builtin)
type getopt
getopts optstring name [args]
- echo $*
- while getopts ":a:bc" opt
- do
- case $opt in
- a) echo "a" $opt $OPTIND $OPTARG;;
- b) echo 'b' $opt $OPTIND $OPTARG;;
- c) echo 'c' $opt $OPTIND $OPTARG;;
- ?) echo "error" exit 1;;
- esac
- done
- echo $OPTIND
- shift $(($OPTIND-1))
- echo $0
- echo $*
对于getopts要有几个地方要清楚
0)随后的第一个参数一定要跟-
$ ./getopts.sh abc (由于没跟-,导致参数无法分析)
abc
1
./getopts.sh
abc
./getopts.sh abc -b (无法分析)
abc
1
./getopts.sh
abc
./getopts.sh -abc (可以分析)
-abc
a a 2 bc
2
./getopts.sh
1) OPTIND变量是存储参数位置的index. 初始值为,一个参数前后如果都要空格,包括选项的参数,那它就会加1
$ ./getopts.sh -a 11 -b -c (按照常理来说的话,-b应该是第二个参数,$OPTIND为3,可结果为4)
-a 11 -b -c
a a 3 11
b b 4
c c 5
5
./getopts.sh -a11 -b -c (11前后没空格了,-b对应的$OPTIND为3)
-a11 -b -c
a a 2 11
b b 3
c c 4
4
./getopts.sh
2)OPTARG 目的是存选项后的参数值的。ms这个不受空格的影响。 只要是"optstring"中含有:就会把其后的值当作选项来存。
./getopts.sh -a -b -c (-b 当作了-a 选项的参数了)
-a -b -c
a a 3 -b
c c 4
4
./getopts.sh
./getopts.sh -a11 -b -c (11仍然是-a选项的参数值)
-a11 -b -c
a a 2 11
b b 3
c c 4
4
./getopts.sh
++++++c program++++
表头文件
|
#include
|
定义函数
|
int getopt(int argc,char * const argv[ ],const char * optstring); |
返回值
如果找到符合的参数则返回此参数字母,
如果参数不包含在参数optstring 的选项字母则返回“?”字符,分析结束则返回-1 (待写)
- #include<unistd.h>
- #include <stdio.h>
- int main(int argc, char *argv[])
- {
- char ch;
- opterr = 0;
- int i=0;
- printf("argc=%d \n",argc );
- for (i=0; i < argc; i++)
- {
- printf("argv[%d]=%s\n",i, argv[i]);
- }
- argc=1;
- while ((ch=getopt(argc, argv,"a:b"))!=-1)
- {
- printf("optind: %d\n", optind);
- switch (ch)
- {
- case 'a':
- printf("option a is %s\n",optarg);
- break;
- case 'b':
- printf("option b is recevied\n");
- break;
- default:
- printf("other option :%c\n",ch);
- }
- }
- printf("optopt +%c\n",optopt);
- return 0;
- }
在调试时发现./getopt -a:cb 不经入while,需要进一步的研究。
另外一点需要说明的是optind
/optarg/optopt都是一些在头文件定义的变量。我们可以直接使用的。
阅读(1477) | 评论(0) | 转发(0) |