Linux 下shell编程
? 什么是shell?Shell是一個命令解析器,是介于Linux操作系統的內核(kernel)與用戶之間的一個絕緣層。shell腳本就是講各類命令預先放入其中,方便一次性執行的一個程序文件,主要用于方便管理員進行設置或者管理。
?? 序員的角度來看, 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。
利用vi等文本編輯器編寫Shell腳本的格式是固定的,如下:
[cpp]?view plaincopy?首行中的符號#!告訴系統其后路徑所指定的程序即是解釋此腳本文件的Shell程序。如果首行沒有這句話,在執行腳本文件的時候,將會出現錯誤。后續的部分就是主程序,Shell腳本像高級語言一樣,也有變量賦值,也有控制語句。除第一行外,以#開頭的行就是注釋行,直到此行的結束。如果一行未完成,可以在行尾加上",這個符號表明下一行與此行會合并為同一行。
編輯完畢,將腳本存盤為filename.sh,文件名后綴sh表明這是一個Bash腳本文件。執行腳本的時候,要先將腳本文件的屬性改為可執行的:
chmod +x filename.sh
執行腳本的方法是:
./filename.sh
下面我們從經典的“hello world”入手,看一看最簡單的Shell腳本的模樣。
[cpp]?view plaincopyShell Script是一種弱類型語言,使用變量的時候無需首先聲明其類型。新的變量會在本地數據區分配內存進行存儲,這個變量歸當前的Shell所有,任何子進程都不能訪問本地變量。這些變量與環境變量不同,環境變量被存儲在另一內存區,叫做用戶環境區,這塊內存中的變量可以被子進程訪問。變量賦值的方式是:
variable_name = variable_value
如果對一個已經有值的變量賦值,新值將取代舊值。取值的時候要在變量名前加$,$variable_name可以在引號中使用,這一點和其他高級語言是明顯不同的。如果出現混淆的情況,可以使用花括號來區分,例如:
echo "Hi, $as"
就不會輸出“Hi, hello worlds”,而是輸出“Hi,”。這是因為Shell把$as當成一個變量,而$as未被賦值,其值為空。正確的方法是:
echo "Hi, ${a}s"
單引號中的變量不會進行變量替換操作。?
關于變量,還需要知道幾個與其相關的Linux命令。
env用于顯示用戶環境區中的變量及其取值;set用于顯示本地數據區和用戶環境區中的變量及其取值;unset用于刪除指定變量當前的取值,該值將被指定為NULL;export命令用于將本地數據區中的變量轉移到用戶環境區。
下面我們來看幾個例子,結合這個例子,我們來講述Shell Script的語法。?
shell程序設計:
一、使用test 測試編寫 unload? 程序,達到文件卸載的功能。
主要考察的是判斷語句的使用 test?
代碼如下:
[cpp]?view plaincopy1、修改文件屬性為其添加可執行權限
[cpp]?view plaincopy2、查看test
[cpp]?view plaincopy3、執行腳本文件
[cpp]?view plaincopy4、結果:
[cpp]?view plaincopy結果目錄里沒有文件
附:這里簡單講解一下cpio命令的使用
cpio [選項] > 文件名或者設備名?
cpio [選項] < 文件名或者設備名
[功能]?
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。
[描述]?
選項說明:詳細選項說明參看下表?
選項 含義?
-o 將文件拷貝打包成文件或者將文件輸出到設備上。?
-i 將打包文件解壓或者將設備上的備份還原到系統。?
-t 查看cpio打包的文件內容或者輸出到設備上的文件內容。?
-v 顯示打包過程中的文件名稱。?
-d 在cpio還原文件的過程中,自動的建立相應的目錄。?
-c 一種較新的存儲方式。?
-B 讓默認的Blocks可以增大到5120 bytes,默認Blocks為512 bytes,這樣做的好處是可以加快存取速度。
注意,?
1)cpio恢復的路徑,如果cpio在打包備份的時候用的是絕對路徑,那么在恢復的時候會自動恢復到這些絕對路徑下,同理,如果在打包備份用的是相對路徑,還原時也將恢復到相對路徑下。
2)cpio無法直接讀取文件,它需要每個文件或者目錄的完整路徑名才能識別讀取,而find命令的輸出剛好做到了這點,因此,cpio命令一般和find命令配合使用。?
3)cpio恢復的時候不會自動覆蓋同名文件。?
4)不會創建目錄而是直接解壓到當前文件夾。
二、編寫腳本你查看當前目錄下的文件屬性(是普通文件還是目錄)
考察的是for語句和判斷語句if...else...
代碼如下:
[cpp]?view plaincopy1、修改文件屬性為其添加可執行權限
[cpp]?view plaincopy2、執行腳本文件
[cpp]?view plaincopy3、結果:
[cpp]?view plaincopy?
三、Shell 函數使用實例
[cpp]?view plaincopy
附:
shell、控制臺、終端的區別:
終端(terminal,或者叫物理終端):?
是一種設備,不是一個程序,一般說的就是能提供命令行用戶界面的設備,典型的是屏幕和鍵盤,或其他的一些物理終端。
虛擬終端:?
屏幕和鍵盤只是一個終端,可能不夠用,又不想增加設備投入,就產生了虛擬終端。
gnome-terminal,urxvt,mlterm,xterm等等是一個程序,職責是模擬終端設備,和虛擬終端的區別表面上在于它以 GUI 形式的窗口出現,內部則是程序結構和系統控制結構有所不同,但本質上差不多。
控制臺(console):?
顯示系統消息的終端就叫控制臺,Linux 默認所有虛擬終端都是控制臺,都能顯示系統消息。
shell:
shell是一個抽象概念,shell的一切操作都在計算機內部,負責處理人機交互,執行腳本等,是操作系統能正常運行的重要組成部分,bash,ash,zsh,tcsh等是shell這個抽象概念的一種具體的實現,都是一個程序,都能生成一個進程對象。
總結
以上是生活随笔為你收集整理的Linux 下shell编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware虚拟机中CentOS网络设置
- 下一篇: Linux命令-网络命令:wall