0%

高级的参数处理

高级的参数处理

getopts

bash内部命令getopts。简单,方便。缺点是功能还不够强大。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[root@vm-101 ~]# cat a.sh
#!/bin/bash

while getopts 'a:n:p:c:x' OPT; do # x后面没有:,代表它不需要带参数
case $OPT in
a)
AGE="$OPTARG";;
n)
NAME="$OPTARG";;
p)
PHONE="$OPTARG";;
c)
CITY="$OPTARG";;
x)
echo "xxxxxxx";;
?)
echo "Usage: `basename $0` [options] filename"
esac
done

shift $(($OPTIND - 1))

echo -e " AGE:$AGE \n NAME:$NAME \n PHONE:$PHONE \n CITY:$CITY"

exit 0


[root@vm-101 ~]# bash a.sh -a 20
AGE:20
NAME:
PHONE:
CITY:
[root@vm-101 ~]# bash a.sh -p 127000000000
AGE:
NAME:
PHONE:127000000000
CITY:
[root@vm-101 ~]# bash a.sh -p 127000000000 -c beijing
AGE:
NAME:
PHONE:127000000000
CITY:beijing
[root@vm-101 ~]# bash a.sh -p 127000000000 -c beijing -a 18
AGE:18
NAME:
PHONE:127000000000
CITY:beijing
[root@vm-101 ~]# bash a.sh -x
xxxxxxx
AGE:
NAME:
PHONE:
CITY:
[root@vm-101 ~]# bash a.sh -x -p 1370000000
xxxxxxx
AGE:
NAME:
PHONE:1370000000
CITY:

getopt

一个外部的参数解析工具,复杂点,但是功能更强大。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[root@vm-101 ~]# cat a.sh
#!/bin/bash

#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项
# 如-carg 而不能是-c arg
#--long表示长选项
#"$@" :参数本身的列表,也不包括命令本身
# -n:出错时的信息
# -- :举一个例子比较好理解:
#我们要创建一个名字为 "-f"的目录你会怎么办?
# mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用
# mkdir -- -f 这样-f就不会被作为选项。

TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
#set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了
eval set -- "$TEMP"

#经过getopt的处理,下面处理具体选项。

while true ; do
case "$1" in
-a|--a-long) echo "Option a" ; shift ;;
-b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;
-c|--c-long)
# c has an optional argument. As we are in quoted mode,
# an empty parameter will be generated if its optional
# argument is not found.
case "$2" in
"") echo "Option c, no argument"; shift 2 ;;
*) echo "Option c, argument \`$2'" ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
echo "Remaining arguments:"
for arg do
echo '--> '"\`$arg'" ;
done



[root@vm-101 ~]# bash a.sh -a
Option a
Remaining arguments:
[root@vm-101 ~]# bash a.sh -c222
Option c, argument `222'
Remaining arguments:
[root@vm-101 ~]# bash a.sh --c-long=333
Option c, argument `333'
Remaining arguments:
[root@vm-101 ~]# bash a.sh --c-long=333 asdf
Option c, argument `333'
Remaining arguments:
--> `asdf'