bash脚本传递参数

#!/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 较快捷的执行参数分析工作






猜你喜欢

转载自blog.csdn.net/Michael_lcf/article/details/103191469