getopt
用在shell脚本中,实现自定义长短选项。
#!/usr/bin/env bash
paras=$(getopt -o a,b:,c:: -l help,in:,out:: -n "$0" -- "$@")
#将$@的所有内容按照getopt给出的条件匹配并复制给paras
选项:
-o #表示短选项
a #表示a不带参数
b: #表示b必须带参数
c:: #表示c的参数可选
-l #表示长选项
help #表示help不带参数
in: #表示in必须带参数
out:: #表示out的参数可选
-n name #表示参数解析错误时,以name为脚本名报错
-- #表示getopt结束位置,分割开$@
“::” 参数可选的选项,短选项和参数之间不能有空格,如下:
[root@server ~]# ./test.sh -a -b 1 -c 2 --in=3 --out=4 --help
-a -b 1 -c 2 --in=3 --out=4 --help
-a -b '1' -c '' --in '3' --out '4' --help -- '2'
[root@server ~]# ./test.sh -a -b 1 -c2 --in=3 --out=4 --help
-a -b 1 -c2 --in=3 --out=4 --help
-a -b '1' -c '2' --in '3' --out '4' --help --
输错没有选项和不带参数的选项时:
./test.sh: invalid option -- 'f'
./test.sh: option requires an argument -- 'b'
-f -a 1 -b
-a -- '1'
#!/bin/bash
paras=$(getopt -o a,b:,c:: -l in:,out::,help -n $0 -- $@)
echo $@
echo $paras
eval set -- "$paras" #将paras字符串里面的内容重新复制给$1、$2……
echo $@
echo "-----------------------------"
echo $4
echo $5
echo $6
echo "-----------------------------"
while true;
do
case "$1" in
-a) echo $1; shift;;
-b) echo $2; shift 2;;
-c) echo $2; shift 2;;
--in) echo $2; shift 2;;
--out) echo $2; shift 2;;
--help) echo $1; shift;;
--) shift; echo $@; break;;
*) exit;;
esac
done
echo "-----------------------------"
echo $@
[root@server ~]# ./test.sh -a -b 1 -c 2 --in=3 --out=4 --help aa bb cc
-a -b 1 -c 2 --in=3 --out=4 --help aa bb cc
-a -b '1' -c '' --in '3' --out '4' --help -- '2' 'aa' 'bb' 'cc'
-a -b 1 -c --in 3 --out 4 --help -- 2 aa bb cc
-----------------------------
-c
--in
-----------------------------
-a
1
3
4
--help
2 aa bb cc
-----------------------------
2 aa bb cc