for 變量名 in 取值列表; do 命令 done
示例: mysql
#!/bin/bash for i in {1..3}; do echo $i done #bash test.sh 1 2 3
相似c語言風格,經常使用於計數,打印數字序列sql
#!/bin/bash for ((i=1;i<=5;i++)); do # 也能夠i-- echo $i done
while 條件表達式; do 命令 done
實例:shell
#!/bin/bash N=0 while [ $N -lt 5 ]; do let N++ echo $N done #bash test.sh 1 2 3 4
當條件表達式爲false時,終止循環
實例2:條件表達式爲ture,將會產生死循環數組
#!/bin/bash while [ 1 -eq 1 ]; do echo "yes" done
break是終止循環
continue跳出當前循環
示例1:在死循環中,知足條件終止循環 bash
#!/bin/bash N=0 while true; do let N++ if [ $N -eq 5 ]; then break fi echo $N done #bash test.sh 1 2 3 4
說明continue用法 ssh
#!/bin/bash N=0 while [ $N -lt 5 ]; do let N++ if [ $N -eq 3 ]; then continue fi echo $N done #bash test.sh 1 2 4
case 模式名 in 模式1) 命令 ;; 模式2) 命令 ;; *) 不符合以上模式執行的命令 esac
示例:根據位置參數匹配不一樣的模式ide
#!/bin/bash case $1 in start) echo "start." ;; stop) echo "stop." ;; restart) echo "restart." ;; *) echo "Usage: $0 {start|stop|restart}" esac #bash test.sh Usage: test.sh {start|stop|restart} #bash test.sh start start. #bash test.sh stop stop. #bash test.sh restart restart.
select 變量 in 選項 1 選項2; do break done
實例:函數
#!/bin/bash select mysql_version in 5.1 5.6; do echo $mysql_version done #bash test.sh 1) 5.1 2) 5.6 #? 1 5.1 #? 2 5.6
PS3="Select a number: " 能夠定義select輸入符spa
格式: function關鍵字可寫,也可不寫命令行
func() { command }
實例:
#!/bin/bash func() { echo "This is a function." } func #調用 #bash test.sh This is a function.
實例2:函數返回值
#!/bin/bash func() { VAR=$((1+1)) return $VAR #return在函數中定義狀態返回值,返回並終止函數,但返回的只能是0-255的數字,相似於exit echo "This is a function." } func echo $? #bash test.sh 2
函數也支持遞歸調用,就是本身調用本身
列如:
#!/bin/bash test() { echo $1 sleep 1 test hello } test
會一直調用打印hello ,造成了閉環
fork×××及時函數遞歸調用
:(){ :|:& };: 或 .(){.|.&};.
:(){ } 定義一個函數,函數名是冒號。
: 調用自身函數
| 管道符
: 再一次遞歸調用自身函數
:|: 表示每次調用函數":"的時候就會生成兩份拷貝。
& 放到後臺
; 分號是繼續執行下一個命令,能夠理解爲換行。
: 最後一個冒號是調用函數。
所以不斷生成新進程,直到系統資源崩潰。
變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間,至關於多個變量的集合
數組是相同類型的元素按必定順序排列的集合。
順序編號是數組的索引或者下標。
下標能夠是任意的字符
自定義的下標爲關聯數組,必須先聲明在使用,和普通數組之間不能夠轉換
下標不連續爲稀疏數組
格式:
array=(元素1 元素2 元素3 ...) 用小括號初始化數組,元素之間用空格分隔。 定義方法1:初始化數組 array=(a b c) 定義方法2:新建數組並添加元素 array[下標]=元素 定義方法3:將命令輸出做爲數組元素 array=($(command)) 交互式數組值對賦值 read -a array
數組操做:
獲取全部元素: #echo ${array[*]} # *和@ 都是表明全部元素 a b c 獲取元素下標: #echo ${!a[@]} 0 1 2 獲取數組長度: #echo ${#array[*]} 3 獲取第一個元素: #echo ${array[0]} a 獲取第二個元素: #echo ${array[1]} b 獲取第三個元素: #echo ${array[2]} c 添加元素: #array[3]=d #echo ${array[*]} a b c d 添加多個元素: #array+=(e f g) #echo ${array[*]} a b c d e f g 將數組的元素個數做爲數組新元素的下標,新元素下標爲原順序編號個數 #array[${#array[@]}]=h 刪除第一個元素: #unset array[0] # 刪除會保留元素下標 #echo ${array[*]} b c d e f g 刪除數組: #unset array 關聯數組:必須聲明才能使用 #student[a]=aaa #student[b]=bbb #student[c]=ccc #echo ${studen[a]} ccc #echo ${student[b]} ccc #echo ${student[c]} ccc #unset student #刪除標準數組 #declare -A studeny #聲明 #student[a]=aaa #student[b]=bbb #student[c]=ccc #echo ${studen[a]} aaa #echo ${student[b]} bbb #echo ${student[c]} ccc
信號(Signal):信號是在軟件層次上對中斷機制的一種模擬,經過給一個進程發送信號,執行相應的處理函數。
進程能夠經過三種方式來響應一個信號:
1)忽略信號,即對信號不作任何處理,其中有兩個信號不能忽略:SIGKILL及SIGSTOP。
2)捕捉信號。
3)執行缺省操做,Linux對每種信號都規定了默認操做
trap命令定義shell腳本在運行時根據接收的信號作相應的處理。
命令格式:trap [-lp] [[arg] signal_spec ...]
-l # 打印編號1-64編號信號名稱
arg # 捕獲信號後執行的命令或者函數
signal_spec # 信號名或編號
通常捕捉信號後,作如下幾個動做:
1)清除臨時文件
2)忽略該信號
3)詢問用戶是否終止腳本執行
示例1:按CTRL+C不退出循環
#!/bin/bash trap "" 2 # 不指定arg就不作任何操做,後面也能夠寫多個信號,以空格分隔 for i in {1..10}; do echo $i sleep 1 done # bash a.sh 1 2 3 ^C 4 5 6 ^C 7 8 ^C 9 10
字符串切片:
${#var}:返回字符串變量var的長度 ${var:offset}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,到最後的 部分,offset的取值在0 到 ${#var}-1 之間(bash4.2後,容許爲負值) ${var:offset:number}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始, 向後number個字符 ${var: -length}:取字符串的最右側幾個字符 注意:冒號後必須有一空白字符 ${var:offset:-length}:從最左側跳過offset字符,一直向右取到距離最右側lengh個字符以前的內容 ${var: -length:-offset}:先從最右側向左取到length個字符開始,再向右取到距離最右側offset個字符之 間的內容
字符串處理:
基於模式取子串
${var#*word}:其中word能夠是指定的任意字符 功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字 符串(含)之間的全部字符 ${var##*word}:同上,貪婪模式,不一樣的是,刪除的是字符串開頭至最後一次由word指定的字符之間的所 有內容 ${var%word*}:其中word能夠是指定的任意字符 功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最後一個字符向左至第一 次出現word字符串(含)之間的全部字符 file="/var/log/messages" ${file%/*}: /var/log ${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最後一次出現word字符之間的全部字符
Shell變量通常是無類型的,可是bash Shell提供了declare和typeset兩個命令⽤於指定變量的類型,兩個命令是等價的
declare [選項] 變量名
-r 聲明或顯示只讀變量 -i 將變量定義爲整型數 -a 將變量定義爲數組 -A 將變量定義爲關聯數組 -f 顯示已定義的全部函數名及其內容 -F 僅顯示已定義的全部函數名 -x 聲明或顯示環境變量和函數 -l 聲明變量爲小寫字母 declare –l var=UPPER -u 聲明變量爲大寫字母 declare –u var=lower
eval命令:
eval命令將會首先掃描命令行進行全部的置換,而後再執行該命令。該命令適用於那些一次掃描沒法實現其功能的
變量.該命令對變量進行兩次掃描
間接變量引用
若是第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱爲間接變量引用
variable1的值是variable2,而variable2又是變量名,variable2的值爲value,間接變量引用是指經過variable1得到變量值value的行爲 variable1=variable2 variable2=value
expect命令:
expect 語法:expect [選項] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
選項
-c:從命令行執行expect腳本,默認expect是交互地執行的 示例:expect -c 'expect "\n" {send "pressed enter\n"} -d:能夠輸出輸出調試信息 示例:expect -d ssh.exp expect中相關命令 spawn 啓動新的進程 send 用於向進程發送字符串 expect 從進程接收字符串 interact 容許用戶交互 exp_continue 繼續執行下面匹配
實例:非交互式登陸遠程主機
#!/usr/bin/expect set ip 172.16.11.3 set user root set password 123123 set timeout 10 spawn ssh $user@$ip expect { "yes/no" { send "yes\n";exp_continue } "password" { send "$password\n" } } interact