#!/bin/bash
#testPa.sh -uxxx -pxxx -txxx -dyyyyyMMdd
#set接受参数
v_user=""
v_pwd=""
v_table=""
v_date=$(date -d"-1 days" +"%Y%m%d")
#接收可选参数
while getopts :u:p:t:d: opt
do
case "$opt" in
u) v_user=$OPTARG;;
p) v_pwd=$OPTARG;;
t) v_table=$OPTARG;;
d) v_date=$OPTARG;;
*) echo "Unknown option: $opt" ;;
esac
done
echo "v_user=${v_user} v_pwd=${v_pwd} v_table=${v_table} v_date=${v_date}"
shift $[ $OPTIND - 1 ]
#进入脚本目录
#cd $(dirname $0)
echo $(dirname $0)
#获取根目录
#BASEHOME=$(dirname $PWD)
echo $(dirname $PWD)
[root@VM_0_11_centos test]# pwd
/root/test
[root@VM_0_11_centos test]# bash testPa.sh
v_user= v_pwd= v_table= v_date=20191120
.
/root
[root@VM_0_11_centos test]#
#!/bin/bash
echo $*
while getopts ":a:bc:" opt
do
case $opt in
a) echo $OPTARG $OPTIND;;
b) echo "b $OPTIND";;
c) echo "c $OPTIND";;
?) echo "error";
exit 1;;
esac
done
echo $OPTIND
shift $(( $OPTIND-1 ))
echo $0
echo $*
[root@VM_0_11_centos test]# /root/test/test2.sh -aaaa -bbbb -cccc
-aaaa -bbbb -cccc
aaa 2
b 2
b 2
b 2
b 3
c 4
4
/root/test/test2.sh
结果这里有一个空行
custom1.list文件内容
[N01] michael 1001
[N02] bob 1002
[N02] michelle 1003
bash读取配置文件
#!/bin/bash
while group name id
do
echo "${group} === ${name} === ${id}"
done < /root/custom1.list
[N01] === michael === 1001
[N02] === bob === 1002
[N02] === michelle === 1003
getopts的使用
语法格式:
getopts [option[:]] [DESCPRITION] VARIABLE
option :表示为某个脚本可以使用的选项
":" :如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
VARIABLE :表示将某个选项保存在变量VARIABLE中
getopts :是linux系统中的一个内置变量,一般用在循环中。每当执行循环是,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项。并将这些合法选项保存在VARIABLE这个变量中。
getopts :还包含两个内置变量,及OPTARG和OPTIND
OPTARG :就是将选项后面的参数(或者描述信息DESCPRITION)保存在这个变量当中。
OPTIND :这个表示命令行的下一个选项或参数的索引(文件名不算选项或参数)
---------------------------------------------------
#!/bin/bash
while getopts ':b:d:' OPT &> /dev/null;do
case $OPT in
b)
echo "The options is b"
echo $OPTARG ;;
d)
echo "The options is d"
echo $OPTARG ;;
*)
echo "Wrong Options"
exit 7 ;;
esac
# echo $OPT
# echo $OPTARG
done
echo $OPTIND
shift $[$OPTIND-1]
echo $1
----------------------------------------------------------
###执行脚本时,显示的结果如下###
[root@localhost scriptTEAM]# ./test -d 'nice' fixnale
The options is d
nice
3
fixnale
###显示信息说明如下###
当输入-d时,$OPT=d,$OPTARG='nice',因此就会显示d)...这一部分的信息。
由于这里有一个选项(-d)和一个参数('nice'),$OPTIND指向命令行中下一个选项或参数的索引位置,因此这里即为3。
shift $[$OPTIND-1]表示将文件名前面的选项和参数踢掉
=============================================================================================================
[root@localhost ~]# cat getopts.sh
#!/bin/bash
echo $*
while getopts ":a:bc:" opt
do
case $opt in
a) echo $OPTARG $OPTIND;;
b) echo "b $OPTIND";;
c) echo "c $OPTIND";;
?) echo "error"
exit 1;;
esac
done
echo $OPTIND
shift $(( $OPTIND-1 ))
echo $0
echo $*
-----------------------------------------------------
[root@localhost ~]# sh getopts.sh -a 11 -b -c 6
-a 11 -b -c 6
11 3
b 4
c 6
6
getopts.sh
--------------------------------------------------
为什么会得到上面的结果呢?
while getopts ":a:bc:" opt #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数。
$OPTARG 存储相应选项的参数,如上例中的11、6;
$OPTIND 总是存储原始$*中下一个要处理的选项(不是参数,而是选项,此处指的是a,b,c这三个选项,而不是那些数字,当然数字也是会占有位置的)位置。
optind初值为1,遇到"x",选项不带参数,optind+=1;遇到"x:",带参数的选项,optarg=argv[optind+1],optind+=2;遇到"x::",可选参数,属于#1和#2之一(转载过来的,这句我也看不懂)
第一行输出echo $*
第二行,optind初值为1,选项-a的参数为11,下一个要处理的选项-b位置为3,所以输出:11 3;
第三行,然后-b要处理的下一个选项-c位置为4,所以输出:b 4;
第四行,再者-c有参数,所以下一个要处理的位置+2,所以输出:c 6;
------------------------------------------------------------------
[root@localhost ~]# sh getopts.sh -a 11 -b -b 9 -c 6
-a 11 -b -b 5 -c 6
11 3
b 4
b 5
5
getopts.sh
9 -c 6
------------------------------------------------------------
起初我看到以上的输出结果百思不得其解,后面多试几次选项及参数后,大概猜了一下。
第一行输出echo $*
第二行,optind初值为1,下一个要处理的选项-b位置为3,所以输出11 3;
第三行,下一个要处理的选项-b位置为4,所以输出b 4;
第四行,下一个要处理的选项-b位置为5,所以输出b 5;
程序现在遇到9,不属于getopts,所以停止循环while,下面几行就不解释了。
getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数。
两者的比较
(1)getopts 是 Shell 内建命令,getopt 是一个独立外部工具
(2)getopts 使用语法简单,getopt 使用语法较复杂
(3)getopts 不支持长参数(如:--option ),getopt 支持
(4)getopts 不会重排所有参数的顺序,getopt 会重排参数顺序(这里的区别下面会说明)
(5)getopts 出现的目的是为了代替 getopt 较快捷的执行参数分析工作