set –
set --是根据分隔符IFS,把值依次赋给$1,$2,$3,例子2就是展示这个。
getopt
$ getopt --help
用法:
getopt optstring parameters
getopt [options] [--] optstring parameters
getopt [options] -o|--options optstring [options] [--] parameters
选项:
-a, --alternative 允许长选项以 - 开始
-h, --help 这个简短的用法指南
-l, --longoptions <长选项> 要识别的长选项
-n, --name <程序名> 将错误报告给的程序名
-o, --options <选项字符串> 要识别的短选项
-q, --quiet 禁止 getopt(3) 的错误报告
-Q, --quiet-output 无正常输出
-s, --shell <shell> 设置 shell 引用规则
-T, --test 测试 getopt(1) 版本
-u, --unquoted 不引用输出
-V, --version 输出版本信息
注意getopt等输出,--之后的内容不会用来去匹配options,在输出中会在--后面打印出来
在输出中,--前面的是匹配options的结果
# getopt a:b -a aa -b -- 1 2 3
-a aa -b -- 1 2 3
# getopt a:b -a aa -- -b -- 1 2 3
-a aa -- -b -- 1 2 3
把getopt的输出传递给set --,就可以获取$1,$2..的值了
# eval set -- $(getopt a:b -a aa -b -- 1 2 3)
# echo $@
-a aa -b -- 1 2 3
# eval set -- $(getopt a:b -a aa -- -b 1 2 3)
# echo $@
-a aa -- -b 1 2 3
# echo $1
-a
# echo $2
aa
# echo $3
--
# echo $4
-b
# echo $5
1
# echo $6
2
# echo $7
3
getopt sample
#!/bin/bash
opts=$(getopt -o a:b:s:u -l av:,bv:,sv:,uv -- "$@")
echo $opts
eval set -- $opts
while :;
do
case $1 in
"-a" | "--av") shift; echo "a $1";;
"-b" | "--bv") shift; echo "b $1";;
"--") shift; break;;
esac
shift
done
# 上面的脚本中,如果不使用eval,那么处理不了参数中的空格,
# ./gopt.sh -a a -b "b1 b2"
-a 'a' -b 'b1 b2' --
a 'a'
b 'b1
# 使用了eval之后,b的值就正常了
# ./gopt.sh -a a -b "b1 b2"
-a 'a' -b 'b1 b2' --
a a
b b1 b2
另外要注意的是,使用了option的时候,option之后必须有--,否则不能正常执行
getopts
只支持短选项
getopts命令是用来解析Shell脚本命令行参数的工具,getopts命令参数包含需要被识别的选项字符,
如果选项字符后面跟着一个冒号,则表明该字符选项需要一个命令行参数(选项字符与对应的命令行参数之间以空格分隔)(注意:冒号&问号不能被用作为选项字符)。
getopts命令每次被调用时,它会将下一个选项字符放置到变量中,OPTARG则可以拿到参数值;如果option前面加冒号,则代表忽略错误
getopts 一般用在循环中,每次执行循环,getopts 就检查下一个命令行参数,并判断它是否合法。
即检查参数是否以 - 开头,后面跟一个包含在 options 中的字母。如果是,就把匹配的选项字母存在指定的变量 variable 中,并返回退出状态0;
如果 - 后面的字母没有包含在 options 中,就在 variable 中存入一个 ?,并返回退出状态0;如果命令行中已经没有参数,或者下一个参数不以 - 开头,就返回不为0的退出状态。
getopts还包含两个内置变量,及OPTARG和OPTIND
OPTARG 就是将选项后面的参数(或者描述信息DESCPRITION)保存在此变量当中。
OPTIND 这个表示命令行的下一个选项或参数的索引(文件名不算选项或参数)
while getopts "n:c:o:h" OPT;do
case $OPT in
"n") NETWORK_DIR="$OPTARG";;
"c") CASE_DIR="$OPTARG";;
"o") OWNER="$OPTARG";;
"h") usage;;
"?") usage;;
esac
done
上篇trap