天天看點

初識Shell

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,如需轉載請自行聯系原作者

繼續閱讀