如何优雅的写出命令行参数
1. getopts介绍
为了更好的将程序应用,我们往往会写一些命令行参数,这些参数使我们不必每一次都要打开原始代码更改一些代码。这对于没有使用过程序的人员来说,会很迷惑需要一定的时间熟悉,找到需要更改的地方。为此,我们会在C++,python以及R中写过一些命令行参数,现在我们来看看Shell脚本的写法。
getopts 是Linux Shell自带的一个函数,可以优雅的撰写命令行参数。
2. getopts语法
getopts options variable
# getopts - shell 指令
# options - 命令行参数选项,用于命令行操作(单字母或短选项)
# variable - 将命令行参数转化为shell指令中的变量
- getopts 与 while 联合,并配合 case 指令,执行循环,检查命令行参数,并判断它是否合法。即参数是否以 短横线 ‘-’ 开头,后面跟一个包含在 options 中的字母。
- options 一般使用单字母,比如
a:b:c
。- 字母后紧跟
:
,表明该选项必须有参数;无:
的字母,表示不需要参数 - getopts 包含两个内置变量:OPTARG和OPTIND
- OPTARG:用以保存选项(字母)后的参数值
- OPTIND:保存了命令行下一个选项或参数的索引
- 字母后紧跟
- 返回值
- 遍历过程中,如果命令行选项字母存在于 options 中,则选项字母赋值给 variable;
- 如果命令行选项字母不存在于 options 中,则将
?
赋值于 variable
一些特殊的命令行参数
$0 #即命令本身,相当于c/c++中的argv[0]
$1 #第一个参数
$2, $3, $4 ... #第2、3、4个参数,依次类推
## 主要为简单命令行参数使用
$# #参数的个数,不包括命令本身
$@ #参数本身的列表,不包括命令本身
$* #和$@相同,但"$*"和"$@"(加引号)并不同,
#"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组
3. 示例
#!/bin/bash
function Usage(){
echo "Usage:"
echo " $(basename $0) [options]"
echo " -a options 01"
echo " -b options 02"
echo " -c "
}
:<<EOF
echo "命令行参数个数(不包含命令.sh本身):" $#
echo "参数列表(不包含命令.sh本身):" $@
echo "参数(字符串形式):" $*
EOF
# 判断是否有参数
if [ $# -eq 0 ]
then
Usage
exit 1
fi
while getopts a:b:c opt
do
case $opt in
a)
First=$OPTARG;;
b)
Second=$OPTARG;;
c)
Third=$OPTARG;;
\?)
Usage
exit 1
esac
done
# 判断参数是由值传入
if [[ ${#First} = 0 || ${#Second} = 0 ]]
then
Usage
exit 1
fi
echo "First option:" $First
echo "Second option:" $Second
echo "Third option:" $Third
注意
- 当参数设置中使用带参数的选项时,一定要注意参数位置,且必须给出参数值,否则会将后一个参数作为参数值传入(赋值于OPTARG)。为避免这种情况的发生,必须注意参数书写。
./test0806.sh -a 1 -b -c
First option: 1
Second option: -c
Third option:
# -c 选项被认为是-b的值
正确的书写
./test0806.sh -a 1 -b 2 -c
First option: 1
Second option: 2
Third option: