前言
一般许多 shell
脚本都希望支持多个参数的输入,一般程序的起始函数 main
都会有一个args选项代表着输入的参数项,那么解析这些参数项就是今天的主要任务。
这里有两种解析方法:
通过逻辑遍历所有的输入参数(主要利用
shift
函数或者shell
对数组的处理)利用系统自带的函数
getopt
配合shift
进行格式化解析(不一定所有系统都有,需要检测一下)
使用 shift
解析脚本的参数输入
在shell
脚本中使用$
后加特定标记来获取脚本的传入参数,详见下表:
参数 | 描述 |
---|---|
$0 |
命令本身,类似于C的args[0] |
$1 /$2 …… |
表示第一个参数、第二个参数 |
$# |
表示参数个数 |
$@ |
用列表形式返回参数列表,但不包括$0 |
$? |
执行上一个命令所返回的结果 |
在shell
脚本中,$1
到$9
相当于一个双向队列,脚本的参数按顺序进入$1
-$9
变量中。如果参数个数大于9,就需要通过shift
函数来处理。
shift
函数的功能:让第一个参数出队列,队列中顺序左移,第10个参数入队列到$9
变量中。
因此,shift
函数可以用来处理脚本参数超过9个的情况,但更多的是用来解析脚本多个参数。
shift
可以把参数列表左移1个,同时参数个数减1;shift 2
可以把参数列表左移2个,同时参数个数减2;特别要注意的是当参数个数为2时,shift 3
运行会出错(返回1,可以$?
检查是否执行成功)
xxx.sh:
shift 3;
echo "$?"
echo "$#"
执行
chmod +x xxx.sh
./xxx.sh -1 -2
输出:
1
2
可以看出,shift 3
执行失败,参数没有进行左移。
因此,在处理脚本参数的时候,必要情况需要判断shift
是否成功。当然getopt
函数可以很大程度的避免这些判断逻辑。
这里主要运用$#
和$@
这两个变量即可遍历所有的传入参数,在不使用getopt
这个函数的情况下,要遍历所有的输入参数可以参考如下脚本:
#!/bin/bash
until [ $# -eq 0 ]
do
case "$1" in
-h|--help)
echo "-h | --help";
exit 0
;;
-a|--along