Linux Shell 脚本接受命令行参数
方式一: 直接利用$n(n为1-9)的方式按位置进行获取
#!/bin/bash
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
方式二: 使用内置命令getopts获取命名参数
语法:getopts optstring varname
解析:
- optstring是一个符合规则的字符串,如:'a:b:cd',这表示可以传4个选项-a -b -c -d其中-a, -b选项的:表示是选项后面要有参数的
- varname表示读取到的选项
- 特殊变量 ${OPTARG}能够获取选项后面跟的参数
- 特殊变量 ${OPTIND} 反映下一个要处理的参数索引,初始值是1
注:
- getopts不支持长选项参数
- 对于有参数的选项必须要用空格分隔,如-a arg
- 对于没有参数的选项是可以连起来的,如 -bc 等同于 -b -c
while getopts 'a:bcd:' OPT; do
case ${OPT} in
a)
echo "选项-a已经生效"
echo "选项-a是可以带参数的,参数值为:"${OPTARG}
;;
b)
echo "选项-b已经生效"
echo "选项-b是不需要参数的"
;;
c)
echo "选项-c已经生效"
echo "选项-c是不需要参数的"
;;
d)
echo "选项-d已经生效"
echo "选项-d是可以带参数的,参数值为:"${OPTARG}
;;
*)
echo "无效的参数"
;;
esac
done
方式三: 使用外部命令getopt获取命名参数
语法:getopt [OPTION...]
- -o 短选项optstring
- -l 长选项optstring
- -- parameters
解析
1.getopt命令的选项说明
- -a 表示是否支持长选项的简单模式(即以一个 -接长选项),必须与-l同时用
- -o 后面接getopt支持短选项列表
- -l 后面接getopt支持长选项列表
2.optstring是一个符合规则的字符串,如: 'a:,b:,cd::'(短选项)'apple:,banana:,cherry::'(长选项)
- 一个:代表必选参数
- 两个::代表可选参数
3.每解析一个选项,有参数的shift 2 ,没有参数的 shift
【1】使用getopt获取一个解析后的字符串
parse_options=$(getopt -o a,b:,c::,d -l apple,banana:,cherry:: -- $@)
【2】将传递的参数设置成刚解析的字符串,
# --代表传递的参数,eval是为了防止有shell关键字和可选参数的的空格识别
eval set -- $parse_options
【3】遍历参数
while true; do
case "$1" in
-a | --apple)
echo "I have an apple!"
shift
;;
-b | --banana)
echo "I have a banana,banana is $2"
shift 2
;;
-c | --cherry)
case $2 in
'')
echo "I have a cherry!"
shift 2
;;
*)
echo "I have a cherry!It is $2"
shift 2
;;
esac
;;
-d)
echo "I have a dog!"
shift
;;
--)
shift
break
;;
*)
echo "Parse Error!"
exit 1
;;
esac
done
getopts和getopt的区别
- getopts 是Shell内建命令 , getopt 是一个独立外部工具
- getopts 使用语法简单 , getopt 使用语法复杂
- getopts 不支持长选项, getopt 支持长选项
- getopts 不会重排所有参数的顺序,getopt 会重排参数顺序
- getopts 的Shell内置 OPTARG 这个变量,getopts 通过修改这个变量依次获取参数, getopt 必须使用 set 来重新设定位置参数,然后在 getopt 中使用 shift 来依次获取参数
- getopts 可以接受参数有空格, getopt 只有新版的才可以有空格