資源描述:
《shell編程入門》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、從程序員的角度來看,Shell本身是一種用C語言編寫的程序,從用戶的角度來看,Shell是用戶與Linux操作系統(tǒng)溝通的橋梁。用戶既可以輸入命令執(zhí)行,又可以利用Shell腳本編程,完成更加復(fù)雜的操作。在LinuxGUI日益完善的今天,在系統(tǒng)管理等領(lǐng)域,Shell編程仍然起著不可忽視的作用。深入地了解和熟練地掌握Shell編程,是每一個Linux用戶的必修功課之一。Linux的Shell種類眾多,常見的有:BourneShell(/usr/bin/sh或/bin/sh)、BourneAgainShell(/bin/bash)、CShell(/usr/bin/csh)、KShell(/usr
2、/bin/ksh)、ShellforRoot(/sbin/sh),等等。不同的Shell語言的語法有所不同,所以不能交換使用。每種Shell都有其特色之處,基本上,掌握其中任何一種就足夠了。在本文中,我們關(guān)注的重點(diǎn)是Bash,也就是BourneAgainShell,由于易用和免費(fèi),Bash在日常工作中被廣泛使用;同時,Bash也是大多數(shù)Linux系統(tǒng)默認(rèn)的Shell。在一般情況下,人們并不區(qū)分BourneShell和BourneAgainShell,所以,在下面的文字中,我們可以看到#!/bin/sh,它同樣也可以改為#!/bin/bash。利用vi等文本編輯器編寫Shell腳本的格式是
3、固定的,如下:#!/bin/sh#commentsYourcommandsgohere首行中的符號#!告訴系統(tǒng)其后路徑所指定的程序即是解釋此腳本文件的Shell程序。如果首行沒有這句話,在執(zhí)行腳本文件的時候,將會出現(xiàn)錯誤。后續(xù)的部分就是主程序,Shell腳本像高級語言一樣,也有變量賦值,也有控制語句。除第一行外,以#開頭的行就是注釋行,直到此行的結(jié)束。如果一行未完成,可以在行尾加上",這個符號表明下一行與此行會合并為同一行。編輯完畢,將腳本存盤為filename.sh,文件名后綴sh表明這是一個Bash腳本文件。執(zhí)行腳本的時候,要先將腳本文件的屬性改為可執(zhí)行的:chmod+xfilena
4、me.sh執(zhí)行腳本的方法是:./filename.sh下面我們從經(jīng)典的“helloworld”入手,看一看最簡單的Shell腳本的模樣。#!/bin/sh#printhelloworldintheconsolewindowa="helloworld"echo$aShellScript是一種弱類型語言,使用變量的時候無需首先聲明其類型。新的變量會在本地?cái)?shù)據(jù)區(qū)分配內(nèi)存進(jìn)行存儲,這個變量歸當(dāng)前的Shell所有,任何子進(jìn)程都不能訪問本地變量。這些變量與環(huán)境變量不同,環(huán)境變量被存儲在另一內(nèi)存區(qū),叫做用戶環(huán)境區(qū),這塊內(nèi)存中的變量可以被子進(jìn)程訪問。變量賦值的方式是:variable_name=vari
5、able_value如果對一個已經(jīng)有值的變量賦值,新值將取代舊值。取值的時候要在變量名前加$,$variable_name可以在引號中使用,這一點(diǎn)和其他高級語言是明顯不同的。如果出現(xiàn)混淆的情況,可以使用花括號來區(qū)分,例如:echo"Hi,$as"就不會輸出“Hi,helloworlds”,而是輸出“Hi,”。這是因?yàn)镾hell把$as當(dāng)成一個變量,而$as未被賦值,其值為空。正確的方法是:echo"Hi,${a}s"單引號中的變量不會進(jìn)行變量替換操作。關(guān)于變量,還需要知道幾個與其相關(guān)的Linux命令。env用于顯示用戶環(huán)境區(qū)中的變量及其取值;set用于顯示本地?cái)?shù)據(jù)區(qū)和用戶環(huán)境區(qū)中的變量及
6、其取值;unset用于刪除指定變量當(dāng)前的取值,該值將被指定為NULL;export命令用于將本地?cái)?shù)據(jù)區(qū)中的變量轉(zhuǎn)移到用戶環(huán)境區(qū)。下面我們來看一個更復(fù)雜的例子,結(jié)合這個例子,我們來講述ShellScript的語法。1#!/bin/bash2#wehavelessthan3arguments.Printthehelptext:3if[$#-lt3];then4cat<7、.HTMfilesin*.html:9ren'HTM$''html'*.HTM1011HELP12exit013fi14OLD="$1"15NEW="$2"16#Theshiftcommandremovesoneargumentfromthelistof17#commandlinearguments.18shift19shift20#$*containsnowallthefiles:21forfilein$*;do22if[-f"$