Linux命令学习之处理命令行参数函数getopt
前言
getopt的使用
命令格式
-
三种格式 getopt是Linux中的一个命令,通常位于/usr/bin目录中,它可以接受一系列任意形式的命令行选项和参数,并自动将它们转换成适当的格式。getopt的命令使用有一下的三种格式:
getopt optstring parameters
getopt [options] [--] optstring parameters
getopt [options] -o|--options optstring [options] [--] parameters
-
参数介绍 常用参数: -a 使getopt长参数支持"-"符号打头,必须与-l同时使用 -l 后面接getopt支持长参数列表 -n program如果getopt处理参数返回错误,会指出是谁处理的这个错误,这个在调用多个脚本时,很有用 -o 后面接短参数列表,这种用法与getopts类似 -u 不给参数列表加引号,默认是加引号的(不使用-u选项),例如在加不引号的时候 --longopt “select * from db1.table1” $2只会取到select ,而不是完整的SQL语句。
使用说明
-
思路介绍 仅凭getopt命令是不能独立完成shell命令行参数的解析,还需要配合其他命令一起运用才行。 我们可以使用这样一种方法:
-
将getopt命令返回的匹配结果重新作为shell的位置参数,我们在循环中去左移动这些位置参数,每移动一次判断是当前参数是那种类型选项,并执行对应操作。当遇到"–"时,命令参数解析完毕,退出循环; -
getopt返回的结果如何作为shell的传入位置参数呢?此时可以使用shell的内置的set函数,set – arg,arg中的参数作为shell的新的位置参数,可通过$N进行直接引用; -
shift用于参数的左移,shift n表示向左移出n个参数,此时的
0
的
值
是
调
用
s
h
i
f
t
n
之
前
的
0的值是调用shift n之前的
0的值是调用shiftn之前的(n+1)值。 -
样例脚本
#!/bin/sh
SHORTOPTS="h,o:"
LONGOPTS="help,output:"
ARGS=$(getopt --options $SHORTOPTS \ #①
--longoptions $LONGOPTS -- "$@" )
eval set -- "$ARGS"
while true;
do
case $1 in
-h|--help)
echo "Print Help Information "
shift
;;
-o|--output)
echo "Output result to $2 directory"
shift 2
;;
--)
shift
break
;;
esac
done
① --options表示短选项,–longoptions表示长选项,这里使用的是上述getopt命令的第三种形式。 如果–options、–longoptions后要指定多个选项参数,不同选项之间可以通过","进行分割指定;如果选项需要跟随一个参数,该选项后面需要加":",如果选项后面需要跟随一个可选参数,该选项后面需要加"::"。 -
结果分析
./shell.sh -h --help -o YOCTO --output=Public
Print Help Information
Print Help Information
Output result to YOCTO directory
Output result to Public directory
脚本分析
-
样例脚本
opts=`getopt -o abc:d: --long aa,bb,cc:,dd: -n "myscript" -- "$@"`
if [ $? != 0 ] ; then echo "Failed parsing options." >&2; exit 1; fi
eval set -- "$OPTS"
其他
-
$* 和 $@ 的区别
参数不被双引号(" ")包含时:
$* 和 $@ 都表示传递给函数或脚本的所有参数,都以"$1" “
2
"
…
"
2" … "
2"…"n” 的形式输出所有参数。
参数被双引号(" ")包含时:
“$*” 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数; “$@” 会将各个参数分开,以"$1" “
2
"
…
"
2" … "
2"…"n” 的形式输出所有参数。 -
shift函数 shift(shift 1) 命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。 -
中括号常用参数 -n 判断变量值不为空(若为空则为true) -
${parameter:offset} ${parameter:offset} 和 ${parameter:offset:length} 扩展让我们只扩展参数的一部分,返回一个从指定字符开始的${parameter:offset}子字符串。如果未指定长度,则扩展继续进行,直到原始字符串的结尾。这种类型的扩展称为:${parameter:offset:length}
参考链接
-
命令行参数处理函数getopt和getopts https://www.jianshu.com/p/905ed52761de -
shell中使用getopts、getopt处理命令行参数 https://www.cnblogs.com/053179hu/p/14429727.html -
Shell脚本中参数处理方法 https://www.zmonster.me/2014/08/09/pare-arguments-in-shell-function#org29fcbdf
|