Shell指令碼程式設計詳解

2023-01-22 19:39:05 字數 4925 閱讀 5068

● shell命令列的執行

● 編寫、修改許可權和執行shell程式的步驟

● 在shell程式中使用引數和變數

● 表示式比較、迴圈結構語句和條件結構語句

● 在shell程式中使用函式和呼叫其他shell程式

◆ shell命令列的書寫規則

對shell命令列基本功能的理解有助於編寫更好的shell程式,在執行shell命令時多個命令可以在乙個命令列上執行,但此時要使用分號(;)分隔命令,例如:

[root@localhost root]# ls a* -l;free;df

長shell命令列可以使用反斜線字元(\)在命令列上擴充,例如:

[root@localhost root]# echo 「this is \

>long command」

this is long command

注意:「>」符號是自動產生的,而不是輸入的。

◆ 編寫shell程式

◆ 執行shell程式

shell程式有很多類似c語言和其他程式語言的特徵,但是又沒有程式語言那樣複雜。shell程式是指放在乙個檔案中的一系列linux命令和實用程式。在執行的時候,通過linux作業系統乙個接乙個地解釋和執行每條命令。

首先,來編寫第乙個shell程式,從中學習shell程式的編寫、修改許可權、執行過程。

編輯乙個內容如下的源程式,儲存檔名為date,可將其存放在目錄/bin下。

[root@localhost bin]#vi date

#! /bin/sh

echo 「mr.$user,today is:」

echo &date 「+%b%d%a」

echo 「wish you a lucky day !」

注意:#! /bin/sh通知採用bash解釋。如果在echo語句中執行shell命令date,則需要在date命令前加符號「&」,其中%b%d%a為輸入格式控制符。

編輯完該檔案之後不能立即執行該檔案,需給檔案設定可執行程式許可權。使用如下命令。

[root@localhost bin]#chmod +x date

執行shell程式有下面三種方法:

方法一:

[root@localhost bin]#./ date

is:二月 06 星期二

wish you a lucky day !

方法二:

另一種執行date的方法就是把它作為乙個引數傳遞給shell命令:

[root@localhost bin]# bash date

is:二月 06 星期二

wish you a lucky day !

方法三:

為了在任何目錄都可以編譯和執行shell所編寫的程式,即把/bin的這個目錄新增到整個環境變數中。

具體操作如下:

[root@localhost root]#export path=/bin:$path

[root@localhost bin]# date

is:二月 06 星期二

wish you a lucky day !

例項 12-1:編寫乙個shell程式mkf,此程式的功能是:顯示root下的檔案資訊,然後建立乙個kk的資料夾,在此資料夾下建立乙個檔案aa,修改此檔案的許可權為可執行。

分析:此shell程式中需要依次執行下列命令為:

進入root目錄:cd /root

顯示root目錄下的檔案資訊:ls –l

新建資料夾kk: mkdir kk

進入root/kk目錄:cd kk

新建乙個檔案aa: vi aa #編輯完成後需手工儲存

修改aa檔案的許可權為可執行:chmod +x aa

回到root目錄:cd /root

因此該shell程式只是以上命令的順序集合,假定程式名為mkf

[root@localhost root]#vi mkf

cd /root

ls –l

mkdir kk

cd kk

vi aa

chmod +x aa

cd /root

◆ 位置引數

◆ 內部引數

如同ls命令可以接受目錄等作為它的引數一樣,在shell程式設計時同樣可以使用引數。shell程式中的引數分為位置引數和內部引數等。

由系統提供的引數稱為位置引數。位置引數的值可以用$n得到,n是乙個數字,如果為1,即$1。類似c語言中的陣列,linux會把輸入的命令字串分段並給每段進行標號,標號從0開始。

第0號為程式名字,從1開始就表示傳遞給程式的引數。如$0表示程式的名字,$1表示傳遞給程式的第乙個引數,以此類推。

上述過程中的$0是乙個內部變數,它是必須的,而$1則可有可無,最常用的內部變數有$0它們的含義如下。

● $0:命令含命令所在的路徑。

● $#:傳遞給程式的總的引數數目。

● $?:shell程式在shell中退出的情況,正常退出返回0,反之為非0值。

● $*:傳遞給程式的所有引數組成的字串。

例項 12-2:編寫乙個shell程式,用於描述shell程式中的位置引數為:$0程式名為test1,**如下:

[root@localhost bin]#vi test1

#! /bin/sh

echo 「program name is $0」;

echo 「there are totally $# parameters passed to this program」;

echo 「the last is $?」;

echo 「the parameter are $*」;

執行後的結果如下:

[root@localhost bin]# test1 this is a test program //傳遞5個引數(./test this```)

program name is /bin/test1給出程式的完整路徑和名字

there are totally 5 parameters passed to this program //引數的總數

the last is 0程式執行效果

the parameters are this is a test program返回由引數組成的字串

注意:命令不計算在引數內。

例項 12-3:利用內部變數和位置引數編寫乙個名為test2的簡單刪除程式,如刪除的檔名為a,則在終端中輸入的命令為:test a

分析:除命令外至少還有乙個位置引數,即$#不能為0,刪除不能為$1,程式設計過程如下。

(1) 用vi編輯程式

[root@localhost bin]#vi test2

#! /bin/sh

if test $# -eq 0

then

echo 「please specify a file!」

else

gzip $1現對檔案進行壓縮

mv $ $home/dustbin移動到**站

echo 「file $1 is deleted

fi(2) 設定許可權

[root@localhost bin]#chmod +x test2

(3) 執行

[root@localhost bin]# test2 a (如果a檔案在bin目錄下存在)

file a is deleted!

◆ 變數的賦值

◆ 變數的訪問

◆ 變數的輸入

在shell程式設計中,所有的變數名都由字串組成,並且不需要對變數進行宣告。要賦值給乙個變數,其格式如下:

變數名=值

注意:等號(=)前後沒有空格

例如: x=6

a=」how are you 」

表示把6賦值給變數x,字串「how are you 」賦值給變數a。

如果要訪問變數值,可以在變數前面加乙個美元符號「$」,例如:

[root@localhost bin]#a=」how are you 」

[root@localhost bin]#echo 「he juest said:$a」

a is:hello world

乙個變數給另乙個變數賦值可以寫成:

變數2=$變數1

例如:x=$i

i++可以寫成:

i=$i+1

在shell程式設計中,變數的值可以作為字串從鍵盤讀入,其格式為:

read 變數

例如:[root@localhost bin]#read str

read為讀入命令,它表示從鍵盤讀入字串到str。

例項 12-4:編寫乙個shell程式test3,程式執行時從鍵盤讀入乙個目錄名,然後顯示這個目錄下所有檔案的資訊。

分析: 存放目錄的變數為directory,其讀入語句為:

read directory

顯示檔案的資訊命令為:ls –a

[root@localhost bin]#vi test3

#! /bin/sh

echo 「please input name of directory」

read directory

cd $directory

ls –l

(2)設定許可權

[root@localhost bin]#chmod +x test3

(3)執行

[root@localhost bin]#./test3

注意:輸入路徑時需「/」

例項 12-5:執行程式test4,從鍵盤讀入x、y的值,然後做加法運算,最後輸出結果。

(1)用vi編輯程式

[root@localhost bin]#vi test4

#! /bin/sh

echo 「please input x y」

read x,y

z=`expr $x+$y`

echo 「the sum is $z」 (報錯,輸出為空: the sum is )

shell指令碼小結

一 輸入 使用者的輸入用 n來表示,n為1 9的自然數,0為指令碼檔名 eg bin bash echo echo echo echo echo 0 echo 1 echo 2 echo 3 二 變數定義 所有變數都是字串,不需要單獨定義,就可以直接賦值。引用變數在名字前加 可以加雙引號包含要引用的...

Shell指令碼基礎知識

1.1 語法基本介紹 1.1.1 開頭 程式必須以下面的行開始 必須方在檔案的第一行 bin sh 符號 用來告訴系統它後面的引數是用來執行該檔案的程式。在這個例子中我們使用 bin sh來執行程式。當編輯好指令碼時,如果要執行該指令碼,還必須使其可執行。要使指令碼可執行 編譯 chmod x fi...

Makefile與shell指令碼區別

在makefile可以呼叫shell指令碼,但是makefile和shell指令碼是不同的。1 shell中所有引用以 打頭的變數其後要加 而在makefile中的變數是以 打頭的後加 例項如下 makefile path data subpath path shell path data subp...