Shell 程式設計 免互動

2022-09-09 11:24:12 字數 4005 閱讀 4513

here document使用i/o重定向的方式將命令列表提供給互動式程式或命令,比如 ftp、cat 或 read 命令。

是標準輸入的一種替代品可以幫助指令碼開發人員不必使用臨時檔案來構建輸入資訊,而是直接就地生產出乙個"檔案"並用作"命令"的標準輸入。here document 也可以與非互動式程式和命令一起使用。

語法格式

1 命令 

2.......

3內容 #標記之間是傳入內容

4.......

5 標記

注意事項免互動方式實現對行數的統計,將要統計的內容置於標記"eof"之間,直接將內容傳給 wc -1 來統計

1     wc -l <

2 > 123

3 > 345

4 > 567

5 >eof

63

通過read命令接受輸入並列印,輸入值是兩個eof標記之間的部分,作為變數 i 的值

通過 passwd 給使用者設定密碼

整體賦值給變數,然後通過echo命令將變數值輸出

bash 的預設注釋是"#",該注釋方法只支援單行注釋;here document 的引入解決了多行注釋的問題

"∶"代表什麼都不做的空命令。 中間標記區域的內容不會被執行, 會被bash 忽略掉,因此可達到批量注釋的效果

1 [root@cheng0307 ~]# fdisk /dev/sdb <

2 >n

3 >p

4 >

5 >

6 >

7 >

8 >w

9 > eof

建立在tcl語言基礎上的乙個工具,常被用於進行自動化控制和測試,解決shell指令碼中互動相關的問題。

準備工作

1 rpm-q expect                     #檢視expect程式是否安裝

2 rpm-q tcl #檢視tcl程式是否安裝

3 yum install_-y expect #未安裝的話進行安裝

指定指令碼直譯器expect 指令碼中首先引入檔案,表明使用的是哪乙個 shell

1 #!/usr/bin/expect
spawn

spawn 後面通常跟乙個linux執行命令,表示開啟乙個會話、啟動程序,並跟蹤後續互動資訊。

例∶spawn passwd root

expect

1 expect "

匹配內容

"

send

向程序傳送字串,用於模擬使用者的輸入;該命令不能自動回車換行,一般要加\r(回車)或者\n,用於代表回車鍵

方式一

1 expect "

密碼" #同一行send部分要有

方式二

1 expect"

密碼 #換行send部分不需要有4"

密碼2" 5"

密碼3" 6}

78#支援多個分支

結束符 expect eof

表示互動結束,等待執行結束,退回到原使用者,與spawn對應

比如切換到root使用者,expect指令碼預設的是等待5s,當執行完命令後,預設停留5s後,白動切回了原使用者

interact

執行完成後保持互動狀態,把控制權交給控制台, 會停留在目標終端而不會退回到原終端,這個時候就可以手工操作了,interact後的命令不起作用,比如interact後新增exit,並不會退出root使用者。而如果沒有interact則登入完成後會退出,而不是留在遠端終端上。使用interact會保持在終端而不會退回到原終端,比如切換到root使用者,會一直在root使用者狀態下;比如ssh到另一伺服器,會一直在目標伺服器終端,而不會切回的原伺服器。

注意∶ expect eof 與 interact 只能二選一。

setexpect 預設的超時時間是 10 秒,通過 set 命令可以設定會話超時時間,若不限制超時時間則應設定為-1。

例∶ set timeout 30

exp_continue

exp_continue 附加於某個 expect 判斷項之後,可以使該項被匹配後,還能繼續匹配該 expect 判斷語句內的其他項。

exp_continue類似於控制語句中的 continue 語句。表示允許 expect 繼續向下執行指令。

例如∶下例將判斷互動輸出中是否存在 yes/no 或 *password。如果匹配 yes/no 則輸出 yes 並再次執行判斷;如果匹配 *password則輸出 abc123 並結束該段 expect 語句。

1

expect 3"

*password

"

注:(使用exp_continue時,如果跟蹤像 passwd 這樣的輸入密碼後就結束程序的命令,expect{}外不要再加上expect eof因為spawn程序結束後會預設向expect傳送eof, 會導致後面的 expect eof 執行報錯)send user

send_user 表示回顯命令,相當於 echo

接收引數

expect 指令碼可以接受從bash命令列傳遞的引數,使用[lindex sar** n]獲得。其中n從0開始,分別表示第乙個,第二個,第三個…引數。

1

set hostname [lindex $ar** 0] #相當於 hostname=s§1

2set password [lindex sar** 1] #相當於 password=$2

1 #!/usr/bin/expect

2# 使用expect免互動實現磁碟建立34

set user [lindex $ar** 0]5

6spawn fdisk $user

78 expect "

獲取幫助

" 9 expect "

select

" 10 expect "

分割槽號"

11 expect "

起始 扇區

" 12 expect "

last 扇區

" 13 expect "

已設定為 linux 型別

" 14

15expect eof

1617

18 chmod +x fdisk.sh #賦予可執行許可權

19 ./fdisk.sh /dev/sdb #執行指令碼

Shell程式設計之免互動

here document變數設定 here document格式控制 expect概述 expect語法 expect執行方式 使用i o重定向的方式將命令列表提供給互動式程式 標準輸入的一種替代品 語法格式 命令 一般用eof eof1 標記可以使用任意合法字元 2 結尾的標記一定要頂格寫,前面...

Shell程式設計 免交互操作

二.here document免互動 三.變數設定 四.here document格式控制 五.多行注釋 六.expect工具 使用i o重定向的方式將命令列表提供給互動式程式 標準輸入的一種替代品命令 標記 互動所需輸入內容 標記例 read a doc file aa.txt eof 456 a...

SHell程式設計之Expect免互動

1 expect是建立在tcl基礎上的乙個工具,expect是用來進行自動化控制和測試的工具。主要解決shell指令碼中不可互動的問題。對於大規模的linux運維很有幫助。2 在linux運維和開發中,我們經常需要遠端登入伺服器進行操作,登入的過程是乙個互動到的過程,可能會需要輸入yes no pa...