这样处理shell脚本参数,爽多了!
在《 shell必备基础知识 》中说到了一些入口参数的基本使用:
/home/shouwang/test.sh para1 para2 para3
$0 $1 $2 $3
脚本名 第一个参数 第三个参数
有什么不方便之处?
看到这里,你可能觉得没什么,这不是学Shell都知道的知识吗?
但是你有没有觉得这样使用参数有这样的问题
- 要知道参数的顺序,确定每一个位置的参数是什么含义
- 不能随意调换位置
- 使用第三个参数,必须要有第一个,第二个参数
下面简单示例说明一下。
参数顺序固定
#!/usr/bin/env bash
#test.sh
echo "para1 $1"
echo "para2 $2"
echo "para3 $3"
这个脚本程序很简单,只是输出第一二三个参数:
$ ./test.sh 1 2 3
para1 1
para2 2
para3 3
你看,这样para1对应第一个参数,如果位置调换了,就变了:
$ ./test 1 3 2
para1 1
para2 3
para3 2
只要顺序一变,参数就对应不上了。假设你有时候不需要第二个参数,要使用第三个参数,你是不是还必须得输入第二个参数?
优雅地处理shell参数
铺垫了这么多,本文到底想介绍什么呢?
实际上这种形式你已经接触过很多了。对于写的程序,我已经在《 如何优雅地处理命令行参数 》中介绍过了,你在使用linux命令的时候想必也已经领略了,例如:
$ find -name "filename"
用-name参数指定要查找的文件名,而不是说第一个参数是文件名,第二个参数是xxx。
那么shell脚本如何像这样将参数当成选项来处理呢?实际上都是类似的,看下面的例子:
#!/usr/bin/env bash
# -n 名称
# -a 作者
# -h 帮助
while getopts ":n:a:h" optname
case "$optname" in
echo "get option -n,value is $OPTARG"
echo "get option -a ,value is $OPTARG"
echo "get option -h,eg:./test.sh -n 编程珠玑 -a 守望先生"
echo "No argument value for option $OPTARG"
echo "Unknown option $OPTARG"
echo "Unknown error while processing options"
#echo "option index is $OPTIND"