shell腳本進階

for語句

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語句

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和contime語句

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語句

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語句

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命令

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
相關文章
相關標籤/搜索