天天看點

linux----->shell進階程式設計----1

   1. 背景

     Shell的作用是解釋執行使用者的指令,使用者輸入一條指令,Shell就解釋執行一條,這種方式稱為互動式(Interactive),Shell還有一種執行指令的方式稱為批處理(Batch),使用者事先寫一個Shell腳本(Script),其中有很多條指令,讓Shell一次把這些指令執行完,而不必一條一條地敲指令。Shell腳本和程式設計語言很相似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不需要編譯,Shell程式從腳本中一行一行讀取并執行這些指令,相當于一個使用者把腳本中的指令一行一行敲到Shell提示符下執行。

    2. 分類與曆史[由于曆史原因,UNIX系統上有很多種Shell]

sh(Bourne Shell):由Steve Bourne開發,各種UNIX系統都配有sh。

csh(C Shell):由Bill Joy開發,随BSD UNIX釋出,它的流程控制語句很像C語言,支援很多Bourne Shell所不支援的功能:作業控制,指令曆史,指令行編輯。

ksh(Korn Shell):由David Korn開發,向後相容sh的功能,并且添加了csh引入的新功能,是目前很多UNIX系統标準配置的Shell,在這些系統上/bin/sh往往是指向/bin/ksh的符号連結。

tcsh(TENEX C Shell):是csh的增強版本,引入了指令補全等功能,在FreeBSD、MacOS X等系統上替代了csh。

bash(Bourne Again Shell):由GNU開發的Shell,主要目标是與POSIX标準保持一緻,同時兼顧對sh的相容,bash從csh和ksh借鑒了很多功能,是各種Linux發行版标準配置的Shell,在Linux系統上/bin/sh往往是指向/bin/bash的符号連結。雖然如此,bash和sh還是有很多不同的,一方面,bash擴充了一些指令和參數,另一方面,bash并不完全和sh相容,有些行為并不一緻,是以bash需要模拟sh的行為:當我們通過sh這個程式名啟動bash時,bash可以假裝自己是sh,不認擴充的指令,并且行為與sh保持一緻。

    3. 編寫第一個腳本: [1.sh]

<code>#! /bin/bash      #指定指令解釋器shell</code>

<code>    </code><code>cd</code> <code>..             </code><code>#切換到上一級目錄</code>

<code>    </code><code>ls</code>                <code>#顯示目前目錄下所有檔案</code>

# 表示注釋, 解釋器不解釋注釋後面的内容

#! 必須位于開頭, 稱為(Shebang), 它表示該腳本使用後面的指定解釋器/bin/bash解釋執行

    4. 執行shell腳本方法

給該腳本回執行權限 如: chmod  a+x 1.sh    然後直接可執行

通過  . 1.sh  執行

通過 source 1.sh 執行

通過指定sh執行  如: /bin/bash 1.sh   或 /bin/bin 1.sh     

    5. 基本文法   

變量分類

環境變量: 環境變量由父程序傳給子程序, 指目前系統的env環境變量

本地變量: 在腳本内定義的變量我們統稱為本地變量,如 sea="hello wolrd!"

内置變量

$? 上一次指令執行結果

$$ 目前程序pid

$0 目前腳本檔案名

$[1-n] 腳本參數

$@ 所有參加清單

$* 同上

$# 參數的個數

變量:

字元統配符

指令展開

`指令` 展開指令  如  sea=`ls`  此時sea儲存的是目前目錄下所有的檔案清單

$(指令)如上

轉義字元

* 比對0個或多個任意字元

? 比對一個任意字元

[若幹字元] 比對括号内任意一個字元并出現一次

變量使用:

    變量名定義  變量名=變量值 (等号兩邊不能有空格) 如 sea="hello world!"

     $變量名: 取變量的值 如sea="hello world!"  echo $sea  輸出結果hello world!

     删除已定義的變量: unset 變量名  如  unset sea

算術:

數算判斷符

-eq  等于

-ne 不等于

-gt 大于

-ge 大于或等于

-lt 小于

-le 小于或等于

送件判斷符

-d 判斷檔案是否是目錄

-f 判斷檔案是否是普通檔案

-p 判斷檔案是否是管道檔案

-r 判斷檔案是否有讀權限

-w 判斷檔案是否有寫權限

-x 判斷檔案是否有執行權限

-z 如果檔案長度為0, 則傳回0(真)

-n 如果檔案長度為非0, 則傳回0(真)

-a 與  如[ -p pipe -a $var2 = "sadsa" ] pipe是管道并且字元串相等

-o 或  如[ -p pipe -a $var2 = "sadsa" ] pipe是管道或者字元串相等

\ 用于去除後面的單個字元的特殊意義(回車除外)

簡單的輸出語句腳本:

<code>#! /bin/sh</code>

<code>#print hello world            #注釋</code>

<code>#authors sea 2016/06/24       </code>

<code>/bin/echo</code> <code>"hello world!"</code>    <code>#列印hello world</code>

<code>/bin/pwd</code>                    <code>#輸出目前路徑</code>

<code>/bin/ls</code>                     <code>#輸出目前目錄下所有檔案</code>

<code>/bin/ls</code> <code>| </code><code>wc</code>                <code>#統計目前目錄下所有檔案</code>

<code>/bin/echo</code> <code>"sea"</code>             <code>#輸出sea</code>

<code>/bin/ps</code> <code>aux                 </code><code>#輸出目前程序詳細情況</code>

         提示: 從程式員的角度來看, Shell本身是一種用C語言編寫的程式,從使用者的角度來看,Shell是使用者與Linux作業系統溝通的橋梁。使用者既可以輸入指令執行,又可以利用 Shell腳本程式設計,完成更加複雜的操作。在Linux GUI日益完善的今天,在系統管理等領域,Shell程式設計仍然起着不可忽視的作用。深入地了解和熟練地掌握Shell程式設計,是每一個Linux使用者的必修 功課之一。

      本文轉自asd1123509133 51CTO部落格,原文連結:http://blog.51cto.com/lisea/1792761,如需轉載請自行聯系原作者