目錄
一、shell數組的定義
二、定義數組的方式
(1)數組名=(value1 value2 value3 value4 ...)
(2)獲取數組的長度
(3)獲取數組下標對應的值
?(4)數組的遍歷
(5)數組切片?
(6)數組替換?
(7)?數組刪除和指定下標的值刪除
(8)數組追加元素?
(9)查看所有數組
?三、Here Document免交互
3.1變量替換成實際值
四、expect免交互
1.expect定義
2. expect中相關命令
3.示例腳本:免交互
一、shell數組的定義
- 數組中可以存放多個值。Bash Shell 只支持一維數組(不支持多維數組)
數組元素的下標由 0 開始。
- Shell 數組用括號來表示,元素用"空格"符號分割開
在shell語句中,使用、遍歷數組的時候,數組格式要寫成 arr[@]或{arr[@]} 或 arr[@]或{arr[*]}
二、定義數組的方式
數組包括的數據類型:
- 數值型
- 字符型 (如果元素值為字符類型,需要加單引號或雙引號,防止單個元素中有空格被當成2個元素)
- 混合型數值+字符??
(1)數組名=(value1 value2 value3 value4 ...)
(2)獲取數組的長度
(3)獲取數組下標對應的值
?
?(4)數組的遍歷
(5)數組切片?
?
(6)數組替換?
(7)?數組刪除和指定下標的值刪除
(8)數組追加元素?
第一種?直接使用下標進行元素的追加
第二種?將數組的長度作為下標進行追加元素
? 第三種:使用+=進行追加
(9)查看所有數組
?三、Here Document免交互
使用I/O重定向的方式將命令列表提供給交互式程序
標準輸入的一種替代品
Here Document 是標準輸 入的一種替代品,可以幫助腳本開發人員不必使用臨時文件來構建輸入信息,而是直接就地 生產出一個文件并用作命令的標準輸入,Here Document 可以與非交互式程序和命令一起使用
注意事項:
- 標記可以使用任意合法字符(通用的字符是EOF)
- 結尾的標記一定要頂格寫,前面不能有任何字符
- 結尾的標記后面也不能有任何字符(包括空格)
- 開頭標記前后的空格會被省略掉
?例1:使用 wc -l 命令后面直接跟文件名就可以統計文件內有多少行內容,將要統計的內容置于標記“EOF” 之間,直接將內容傳給 wc -l 來統計。
<<EOF
.......
EOF
3.1變量替換成實際值
四、expect免交互
1.expect定義
建立在tcl語言基礎上的一個工具,常被用于進行自動化控制和測試主要解決shell腳本中交互相關的問題。
使用expect命令前需要先進行安裝tcl與expect軟件,在安裝expect軟件自動安裝依賴包tcl
先檢查系統內是否安裝expect軟件包
2. expect中相關命令
-
spawn 啟動新的進程(監控,捕捉)
spawn ?passwd root
(1)腳本解釋器
expect 腳本中首先引入文件,表明使用的事哪一種shell
#!/usr/bin/expect
(2)spawn
spawn 后面通常跟一個Linux執行命令,表示開啟一個會話、進程,并跟蹤后續交互信息
例: spawn passwd root
(3)expect
判斷上次輸出結果中是否包含指定的字符串,如果有則立即返回,否則就等待超時時間后返回;只能捕捉有swpan啟動的進程輸出;
用于接受命令執行后的輸出,然后和期望的字符串匹配
(4)send
- 向進程發送字符串,用于模擬用戶的輸入
- 該命令不能自動回車換行,一般要加\r(回車)或者\n,用于代表回車鍵
方式一:
expect "密碼" {send "abc123\r"} ? ? #同一行send部分要有{}方式二:
expect "密碼" ?
send "abc123\r" ? ? ? ? ? ? ? ? ? ?# 換行send部分不需要有{}
方式三:
expect 支持多個分支
expect ? ? ? ? ?#只要匹配了其中一個情況,執行相應的send 語句后退出該expect 語句
只匹配一次
expect
{
{"密碼1" ?{send "abc123\r"}
{"密碼2" ?{send "123123\r"}
{"密碼3" ?{send "123456\r"}}
?(5)?expect eof:結束符
表示交互結束,等待執行結束,退回到原用戶,與spawn對應。
比如切換到root用戶,expect腳本默認的是等待10s當執行完命令后,默認停留10s后,自動切回了原用戶
(6)exp_continue匹配多個字符串在執行動作后加此命令
exp_continue 表示允許 expect 繼續向下執行指令.
exp_continue附加于某個expect 判斷選項之后,可以是該項被匹配后還能繼續匹配expect 判斷語句內的其他項。exp_continue類似于控制語句的continue語句。表示允許expect繼續向下執行命令。
(7)set
expect 默認的超時時間是10秒,通過set 命令可以設置會話超時時間,若不限制超時時間則應設置為-1
例子: set time out 30
(8)send_user
表示回顯命令與echo相同
(9)接收參數(位置變量)
expect 腳本可以接受從bash命令行傳遞參數,使用 [lindex $argv n]獲得。其中你從0開始,分別表示第一個,第二個,第三個.....參數
例子:
set hostname [lindex $argv 0] 相當于hostname=$1
set password [lindex $argv 1] 相當于passswd=$2
expect直接執行,需要expect命令去執行腳本
3.示例腳本:免交互
?①echo '123123' |passwd ? --stdinzhangsan ? #將123123通過標準輸入傳給passwd命令,改222用戶密碼
?②passwd 222 <<EOF ? ? ? #passwd多行重定向輸入密碼給張三
? ? ? ? ? ?12345678
? ? ? ? ? ?12345678
? ? ? ? ? ? EOF
?
vim ?ssh.sh
創建腳本
腳本內容:
#!/usr/bin/expect
#聲明腳本使用的shell
set ip 192.168.30.100
#設ip的為 192.168.30.12
set password 123456
#設置變量password的內容為123456
spawn ssh $ip
#捕捉ssh 192.168.30.100
expect {
#spawn捕捉成功則繼續使用expect捕捉
? ? ? ? "yes/no" {send "yes\n";exp_continue}
#若捕捉到yes/no此內容則輸入yes\n,\n為回車,然后繼續捕捉,若只捕捉一次則不需要繼續捕捉exp_continue
? ? ? ? "password" {send "$password\n"}
#繼續捕捉內容password,捕捉到后輸入變量$password的內容,\n為回車,不繼續捕捉則不需要exp_continue
}
interact ?
#結束符
?
?