數組:存放一個或多個元素的連續的記憶體空間;相當于多個變量的集合
變量:記憶體的存儲空間
變量的特點:每個變量中隻能存放一個資料,變量隻能進行一次性的指派
數組元素:數組中任何一個存放資料的存儲單元
數組的索引:
1.數字索引:索引數組(Index ARRAY)
0,1,2,...
2.名稱(字元串)表示:關聯數組(Related ARRAY)
bash4.0以上的版本才支援
稠密數組:索引編号必須連續
稀疏數組: 索引編号可以不連續,bash數組屬于此類
聲明數組:
1.declare
-i NAME:将NAME聲明為整型變量
-x NAME:将NAME聲明為環境變量
-a NAME:将NAME聲明為索引數組(如果支援)
-A NAME:将NAME聲明為關聯數組(如果支援)
declare -a NAME=("VALUE1" "VALUE2" ...)
declare -a NAME=([0]="value1" [1]="value2" [5]="value3" ...)
2.直接聲明數組
直接為數組指派
ARRAY_NAME=("value1" "value2" ...)聲明稠密數組
ARRAY_NAME=([0]="value1" [1]="value2" [5]="value3" ...)聲明稀疏數組
3.定義數組的元素而建立數組
ARRAY_NAME[0]=value1
ARRAY_NAME[1]=value2 ...
引用數組中的元素
引用變量的方法:${NAME}
引用數組元素的方法:${ARRAY_NAME[INDEX]}
注意:如果不給出INDEX,則表示引用數組的第一個元素,即INDEX=0的元素
引用整個數組的所有元素:${ARRAY_NAME[*]}或者${ARRAY_NAME[@]}
引用數組的索引:$(ARRAY_NAME[*])或者${!ARRAY_NAME[@]}
檢視數組的長度(數組中有效元素的個數)
${#ARRAY_NAME[*]}或者${#ARRAY_NAME[@]}
數組切片:
${ARRAY_NAME:offset}:顯示包括offset數字所表示的索引位置及以後的所有元素;
${ARRAY_NAME:offset:number}:顯示包括offset數字所表示的索引位置及以後的number個元素;
向數組中追加元素:
1.稠密數組:
ARRAY_NAME[${#ARRAY_NAME[*]}]=valueN
2.稀疏數組:
ARRAY_NAME[INDEX]=valueN
注意INDEX必須為未被使用的數組元素索引編号
撤銷數組:
unset ARRAY_NAME
删除數組中的元素:
unset ARRAY_NAME[INDEX]
RANDOM變量0-32767
熵池:/dec/random
/dev/urando
随機
$[$RANDOM%8+1]這可以生成随機數
bash腳本程式設計:
shell腳本程式設計特點
過程式程式設計語言
腳本類語言
解釋型語言
過程式程式設計語言:
順序執行結構 以從左到右,從上到下順序執行所有的語句(指令)shell腳本的主體結構
選擇執行結構 依照給定條件的邏輯判斷結果或者依照可選的取值範圍,進而選擇某個分支中的語句來執行 if:分支選擇标準邏輯判斷的結果 case分支選擇标準根據可選的取值
循環執行結構 對于某特定語句重複執行0次1次或多次
for:周遊指定的清單
while:根據邏輯判斷的結果;
until:根據邏輯判斷的結果;
select:永遠的死循環,利用循環機制提供選擇清單
選擇執行結構
if語句
if 指令; then 指令; [ elif 指令; then 指令; ]... [ else 指令; ] fi
if語句的單分支結構:如果條件為真則執行then後的指令否則不做任何操作;
if CONDITION
then STATEMENT
fi
if CONDITION;then
STATEMENT1
STATEMENT2
注意:想要執行then後面的STATEMENTS,前提條件是CONDITION部分為真
if語句的雙分支結構:如果條件為真,就執行then後面的指令否則執行else後面的指令
if CONDITION ; then
STATEMENT
...
else
fi
if語句的多分支結構:首先判斷CONDITION1是否為真,如果為真,則執行第一個then後面的語句,否則判斷CONDITION2是否為真,如果為真,就執行第二個then後面的語句,如果所有的CONDITION都為假,就執行else後面的語句
if CONDITION1 ; then
elif CONDITION2 ; then
STATEMENT
...
建議if多分支結構能不用就不用
bash腳本程式設計值使用者互動
位置參數變量:$1,$2,$3...
特殊變量
$#:所有的位置參數的總數
$*:所有位置參數的清單,當使用雙引号引用時,整個參數被當成一個字元串
$@:所有位置參數的清單,當使用雙引号引用時,每個參數作為單獨的字元串存在
$0:所執行的腳本檔案自身的路徑
read:read [-a 數組] [-p 提示符] [-t 逾時] [名稱 ...]
名稱一般為變量名或數組名,如果不寫名稱,則系統會将read讀到的資訊儲存到REPLY變量中
[ -z $NAME1 ] && NAME1=link
注意:在使用read指令的時候,通常會使用-t選項來規定逾時時間,一旦使用-t選項定義了逾時時間,必須在後面判斷給定的變量是否為空,如果為空需要為變量提供變量值
shift [n] 移位位置參數
if語句的多分支結構
循環執行結構
将一段代碼重複執行0次1次或多次;
一個好的循環結構,必須包括兩個最重要的環節
進入循環的條件
開始循環時所滿足的條件
退出循環的條件
循環結束所滿足的條件
for循環:
1.周遊清單
for VAR_NAME in LIST ; do 循環體 ; done
for VAR_NAME in LIST ; do
循環體
done
VAR_NAME:任意指定的變量名稱,變量的值是從LIST中取值并指派的
循環體:一般來說是能夠用到VAR_NAME指令或指令的組合,如果循環體中沒有包括VAR_NAME,則可能出現死循環
LIST的生成方式
1)直接給出
2)純整數清單
seq:輸出一個整數清單
seq [FIRST [INCREMENT]] LAST
3) 花括号展開{FIRST..LAST}
4) 指令的執行結果傳回值
5)通配符
6)某些變量的引用:$@,$*
進入循環的條件:LIST有元素可以取用
退出循環的條件:LIST中以被取空,在無元素可用
for循環的特點:
1.幾乎不會出現死循環
2.在執行循環的過程中,需要将這個LIST載入記憶體;是以對于大清單來說可能會過多的消耗記憶體和CPU資源
注意:使用for循環嵌套的時候,外層for循環,控制行數的輸出,内層for循環,控制清單的輸出
2.控制變量
for ((表達式1;表達式2;表達式3)) ; do
循環體
done
表達式1:為變量賦初始值
表達式2:循環的退出條件
表達式3:變量值的變化規律
本文轉自Vincent一馬 51CTO部落格,原文連結:http://blog.51cto.com/mazhenbo/1916722,如需轉載請自行聯系原作者