從程式設計師的角度來看, shell本身是一種用c語言編寫的程式,從使用者的角度來看,shell是使用者與linux作業系統溝通的橋梁。使用者既可以輸入命令執行,又可以利用 shell指令碼程式設計,完成更加複雜的操作。在linux gui日益完善的今天,在系統管理等領域,shell程式設計仍然起著不可忽視的作用。深入地了解和熟練地掌握shell程式設計,是每乙個linux使用者的必修 功課之一。
linux的shell種類眾多,常見的有:bourne shell(/usr/bin/sh或/bin/sh)、bourne again shell(/bin/bash)、c shell(/usr/bin/csh)、k shell(/usr/bin/ksh)、shell for root(/sbin/sh),等等。不同的shell語言的語法有所不同,所以不能交換使用。每種shell都有其特色之處,基本上,掌握其中任何一種 就足夠了。在本文中,我們關注的重點是bash,也就是bourne again shell,由於易用和免費,bash在日常工作中被廣泛使用;同時,bash也是大多數linux系統預設的shell。在一般情況下,人們並不區分 bourne shell和bourne again shell,所以,在下面的文字中,我們可以看到#!/bin/sh,它同樣也可以改為#!/bin/bash。
#!/bin/sh
#comments
your commands go here
首行中的符號#!告訴系統其後路徑所指定的程式即是解釋此指令碼檔案的shell程 序。如果首行沒有這句話,在執行指令碼檔案的時候,將會出現錯誤。後續的部分就是主程式,shell指令碼像高階語言一樣,也有變數賦值,也有控制語句。除第 一行外,以#開頭的行就是注釋行,直到此行的結束。如果一行未完成,可以在行尾加上",這個符號表明下一行與此行會合併為同一行。
編輯完畢,將指令碼存檔為filename.sh,檔名字尾sh表明這是乙個bash指令碼檔案。執行指令碼的時候,要先將指令碼檔案的屬性改為可執行的:
chmod +x filename.sh
執行指令碼的方法是:
./filename.sh
下面我們從經典的「hello world」入手,看一看最簡單的shell指令碼的模樣。
#!/bin/sh
#print hello world in the console window
a = "hello world"
echo $a
shell script是一種弱型別語言,使用變數的時候無需首先宣告其型別。新的變數會在本地資料區分配記憶體進行儲存,這個變數歸當前的shell所有,任何子進 程都不能訪問本地變數。這些變數與環境變數不同,環境變數被儲存在另一記憶體區,叫做使用者環境區,這塊記憶體中的變數可以被子程序訪問。變數賦值的方式是:
variable_name = variable_value
如果對乙個已經有值的變數賦值,新值將取代舊值。取值的時候要在變數名前加$,$variable_name可以在引號中使用,這一點和其他高階語言是明顯不同的。如果出現混淆的情況,可以使用花括號來區分,例如:
echo "hi, $as"
就不會輸出「hi, hello worlds」,而是輸出「hi,」。這是因為shell把$as當成乙個變數,而$as未被賦值,其值為空。正確的方法是:
echo "hi, $s"
單引號中的變數不會進行變數替換操作。
關於變數,還需要知道幾個與其相關的linux命令。
env用於顯示使用者環境區中的變數及其取值;set用於顯示本地資料區和使用者環境區中的變數及其取值;unset用於刪除指定變數當前的取值,該值將被指定為null;export命令用於將本地資料區中的變數轉移到使用者環境區。
下面我們來看乙個更複雜的例子,結合這個例子,我們來講述shell script的語法。
shell指令碼例項
1.批量建立10個系統賬號test01 test10,並隨機設定8位數密碼 bin bash for i in seq w 10 do useradd test i echo random madsum cut c 8 tee a passwd.txt stdin test i done 2.在目錄...
Shell 指令碼例項
指令碼內容如下 bin bash action 定義函式,進行操作指南 action 1 database mysql uroot p 1 en e show databases grep e schema v mkdir p mnt sqldump e database name sql case...
Shell指令碼例項
1.寫乙個指令碼,利用迴圈計算10的階乘 bin sh factorial 1 for a in seq 1 10 dofactorial expr factorial a done echo 10 factorial 注 上面有一行,for a in seq 1 10 其中seq 1 10 即列出...