1.什麼是Shell?
shell處于kernel的外層,用來負責接收使用者輸入的指令,然後将指令解釋成kernel能了解的方式,然後由kernel去執行,再将結果傳回預設的輸出周邊。shell是一種指令解釋器,同時也是一個程式語言。shell有很多種,在衆多的Linux發行版中,标準的shell是bash,也是我們學習的主要對象。
2.shell程式的基本組成結構
shell結構大體是由設定變量、内置指令、shell的文法結構、函數組成。
使用執行個體說明:test.sh
1. #!/bin/bash
2. #說明使用/bin/bash作為這個腳本的解釋器
3.
4. #定義一個函數
5. function my_fun () {
6. echo "Hello, $1,today is $2"
7. }
8.
9. #定義連個變量
10. name=$1
11. today=`date`
12.
13. #函數調用
14. my_fun "$name" "$today"
上面的這個腳本要想運作還需要做一些操作,首先給予執行權限
chmod +x test.sh
然後執行
./test.sh willis
輸出
Hello, willis,today is Tue Jun 1 14:51:46 CST 2010
3.父shell和子shell
在執行script之前,身處的環境就是父shell。執行script之時,父shell根據#!/bin/bash,fork出來一個新的shell環境,然後在子shell中執行,執行完畢後子shell結束,任然回到父shell中,這樣不會影響到父shell的環境。
4.login shell 和non-login shell
這張圖檔是login shell的流程,當是non-login shell時,隻執行方框中的标注的部分。由這張圖我們可以知道,在如下幾種情況下,執行的流程。
4.1登陸(login)
/etc/profile
~/.bash_profile
4.2登出(logout)
~/.bash_logout
5.Shell互動方式
5.1自動互動方法一
自動互動最關鍵的就是互動資訊的自動輸入,首先聯想到檔案重定向,在shell程式設計中有這樣一種用法"command << delimiter (分隔符) 從标準輸入中讀入,直至遇到delimiter分隔符。"
重定向操作符command << delimiter是一種非常有用的指令,shell将分界符delimiter之後直至下一個同樣的分界符之前的所有内容都作為輸入,遇到下一個分界符, shell就知道輸入結束了。最常見的delimiter分界符是EOF,當然完全可以自定為其他字元。
例:磁盤自動分區腳本
#!/bin/bash
fdisk $1 << EOF
n
P
1
(空格)
+1G
w
EOF
mkfs.xfs /dev/vdb1
自動修改使用者密碼腳本
#!/bin/bash
passwd $1 << EOF
willis
5.2自動互動方法二
這時候聯想到互動資訊的另一個自動輸入方法:管道,通過echo + |
例:自動修改使用者密碼腳本
#!/bin/bash
(echo "redhat"
sleep 1
echo "redhat" )|passwd
自動分區
echo '
p
+1G
w '| fdisk $1
mkfs.xfs /dev/vdb1
5.3自動互動方法三
expect就是一個專門用來實作自動互動功能的工具,expect的文法可以參考相關資料,代碼如下:
自動切換到root使用者
#!/usr/bin/expect
spawn su root
expect "password: "
send "willis\r"
expect eof
exit
測試通過,運作這個腳本,直接從目前使用者登入到root使用者。
Shell互動式方法總結:
方法一(重定向)簡單直覺,也經常有實際應用,但是在自動互動領域功能有限。
方法二(管道)也很簡單直覺,有時甚至不用sleep配合就能展現強大的自動互動實力
方法三(expect)在功能上是最為強大的,expect本來就是為實作自動互動功能而生,但是缺點是需要安裝expect包,在嵌入式等環境下難以安裝。
三個方法各有優劣,應用的好,都可以完成Linux Shell自動互動
本文轉自willis_sun 51CTO部落格,原文連結:http://blog.51cto.com/willis/1845287,如需轉載請自行聯系原作者