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 較快捷的執行參數分析工作






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章