shell程式設計簡介

guyuexue發表於2007-11-21
shell程式設計簡介
來源:hpuxZone 編輯:丁克川 2003.11.05 1918?

--------------------------------------------------------------------------------


 

1.1 shell程式設計概述

shell程式是一個包含UNIX命令的普通檔案。

這個檔案的許可許可權至少應該為可讀和可執行。

在shell提示符下鍵入檔名就可執行shell程式。

shell程式可以透過三種方式接受資料:

??-環境變數

??-命令列引數

??-使用者的輸入

shell是一個命令直譯器,它會解釋並執行命令提示符下輸入的命令。但是,你可能想要多次執行一組命令,shell提供了一種功能,讓你將這組命令存放在一個檔案中,然後你可以象unix系統提供的其他程式一樣執行這個檔案,這個命令檔案就叫做shell程式或者shell指令碼。當你執行這個檔案,它會象你在命令列輸入這些命令一樣地執行這些命令。為了讓shell能讀取並且執行你的shell程式,shell指令碼的檔案許可權必須被設定為可讀和可執行。為了讓shell可以找到你的程式,你可以選擇輸入完全路徑名,或者將這個指令碼的路徑放在於你的PATH環境變數指定的路徑列表中。許多的使用者會在他們的HOME目錄下建立一個bin目錄來存放他們自己開發的script,然後將$HOMEbin加入到他們的PATH環境變數中。你可以寫出非常複雜的shell指令碼,因為shell指令碼支援變數、命令列引數、互動式輸入、tests(判斷))、branches(分支),和loops(迴圈)等複雜的結構。

1.2 shell程式舉例

$ cat myprog

#this is the program myprog

date

ls –F

$ myprog

要建立一個shell程式,考慮進行以下步驟:

$ vi myprog ?????一個包含shell命令的程式。

#this is the program myprog

date

ls –F

$ chmod +x myprog 增加檔案的執行模式

$ myprog

Thu Jul 11 1110 EDT 1994

F1 f2 memo myprog

首先使用一個文字編輯器建立一個shell程式myprog。在程式執行之前,這個檔案必須被賦予可執行的許可權。然後在命令提示符下輸入這個程式名,如上例所示,當myprog執行的時候,一個子shell會被建立。這個子shell會從shell程式檔案myprog讀取輸入而不是從命令列讀取輸入,這個shell中的每個命令的執行都會建立一個子shell。一旦所有的命令都被執行,所有的子shell會中止,然後會返回到原始的父shell。

Shell程式中的註釋:

推薦在shell程式中提供註釋語句來註明程式的內容。註釋由一個#符號開始,Shell不會去執行任何在#之後的語句。#能夠出現在命令列的任何位置。

注意:你不可以給shell程式取名為test因為test是一個內部的shell命令。

1.3 傳遞資料給shell程式

$ color = lavender

$ cat color1

echo you are now running program color1

echo the value of the variable color is $color

$ chmod +x color1

$ color1

you ar now running program color1

the value of the variable color is

$ export color

$ color1

you are now running program color1

the value of the variable color is lavender

傳遞資料給shell指令碼的一種方法就是透過環境。在上例中,本地變數color被賦值為lavender,然後建立了shell程式color1;然後更改為可執行許可權;然後這個shell程式被執行,color1指令碼的意圖是顯示color變數的值,但是由於color是一個本地變數,屬於父shell私有的,執行color1產生的子shell不能識別這個變數,因此不能列印出它的值,而當color被輸出到環境中就可以被子shell讀取。

同樣,由於shell程式不能夠更改父程式的環境,對一個子程式中的環境變數重新賦值不會影響到父程式環境中的值。如以下的shell指令碼中的color2。

echo The original value of the variable color is $color

ech0 This program will set the value of color to amber

color=amber

echo The value of color is now $color

echo When your program concludes,display the value of the color variable

觀察在你設定了color的值後有什麼變化。輸出這個變數,然後執行color2

$ export color=lavender

$ echo $color

lanvender

$ color2

The original value of the variable color is lavender

The program will set the value of color to amber

The value of volor is now amber

When your progam concludes, display the value of the color variable,

$ echo $color

lanvender

1.4 shell 程式的引數

命令列:

?$ sh_program arg1 arg2 . . . argx

???$0 ???$1?? $2 ....? $X

例子:

$ cat color3

echo you are now running program $0

echo The value of command line argument #1 is $1

echo The value of command line argument #2 is $2

$ chmod +x color3

$ color3 red green

You are now running program color3

The value of command line argument #1 is red

The value of command line argument #2 is green

大多數的UNIX系統命令可以接收命令列引數,這些引數通常告訴命令它將要操作的檔案或目錄(cp f1 f2),另外指定的引數擴充套件命令的能力(ls –l),或者提供文字字串(banner hi there)。

命令列引數對shell程式同樣有效,使用這種方式傳送資訊給你的程式十分方便。透過開發一個接收命令列引數的程式,你可以傳遞檔案或者目錄命令名給你的程式處理,就像你執行UNIX系統命令一樣,你也可以定義命令列選項來讓命令列使用shell程式額外的功能。

在shell程式中的命令列引數與引數在命令列的位置相關,這樣的引數被稱為位置引數,因為對每一個特殊變數的賦值依靠一這些引數在命令列中的位置,變數的變數名對應變數在命令列中的位置,因此這些特殊的變數名為數字0,1,2等,一直到最後的引數被傳遞,變數名的存取也透過同樣的方法,在名字前面加上$ 符號,因此,為了存取你的shell程式中的命令列引數,你可以應用$0,$1,$2等等。在$9以後,必須使用括號:$(10),$(11),否則,shell會將$10看成是$1後面跟一個0。而$0會一直儲存程式或命令的名字

以下的shell程式會安裝一個程式,這個程式作為一個命令列引數被安裝到你的bin目錄:首先建立程式my_install,注意目錄$HOMEbin應該預先存在。

$ cat my_install

echo $0 will install $1 to your bin directory

chmod +x $1

mv $1 $HOMEbin

echo Installation of $1 is complete

ctrl + d

$ chmod +x my_intalll

$ my_install color3

my_install will install color3 to your bin directory

Installation of color3 is complete



這個例子中,程式指明第一個命令列引數為一個檔名,然後加上執行許可權,然後移動到你當前目錄下的bin目錄下。

記住UNIX系統的慣例是存貯程式在bin的目錄下。你也許想要在你的HOME目錄下建立一個bin目錄,在這個目錄下你可以儲存你的程式檔案,記住要將你的bin目錄放在PATH環境變數中,這樣shell才會找到你的程式。

1.5 一些特殊shell變數- #和

# ???命令列引數的數量

???完全的引數字串

例子:

$ cat color4

echo There are $#?comand line argument

echo They are $

ehco The first command line argument is $1

$ chmod +x color4

$ color4 red green yellow blue

They are 4 command line arguments

They are red green yellow blue

The first command line argument is red



至今為止我們看到的shell程式都不是很靈活,如color3需要輸入兩個正確的引數而my_install只需要一個。通常在建立一個接收命令列引數的shell程式的時候,你想要使用者輸入一個引數的變數號碼。你同時要程式執行成功,不管使用者鍵入1個引數或是20個引數。當處理變數引數列表的時候,特殊shell變數會提供你許多的靈活性。透過$#你可以知道有多少引數已經被輸入,透過$可以存取全部的引數列表,而不管引數的數量。請注意引數($0)不在$這個引數列表裡。

每一個命令列引數都是互相獨立的,你可以透過$集中檢索這些引數,也可以透過$1,$2,$3等等來獨立的檢索這些引數。

一個可以接收多個命令列引數的安裝程式的例子:

$ cat my_install2

echo $0 will install $# files to your bin directory

echo The files to be installed are $

chmod +x $

mv $ $HOMEbin

echo Installaton is complete

ctril + d

$ chmod +x my_install2

$ my_install2 color1 color2

my_intall2 will install 2 files to your bin directory

The files to be installed are color1,color2

Intallaiton is complete

這個安裝程式更加靈活,如果你有多個檔案要安裝,你僅需要執行這個程式一次,只要一次輸入多個名字即可。

非常重要的是:如果你計劃傳遞整個引數的字串給一個命令,這個命令必須能夠接收多個引數。

在以下的指令碼中,使用者提供一個目錄名作為一個命令列引數。程式會更改到指定的目錄,顯示當前的位置,並且列出內容。

$ cat list_dir

cd $

echo You are in the $(pwd) directory

echo The contents of the directory are

ls –F

$ list_dir dir1 dir2 dir3

sh cd bad argument count

由於cd命令不能同時進入到多個目錄中,這個程式執行會出錯。

1.6 shift 命令

向左移動所有的在中的字串n個位置

#的數目減少n個(n的預設值是1)

語法:shift [n]

例子:

$ cat color5

orig_args=$

echo There are $# command line arguments

echo They are $

echo Shifting two arguments

shift 2

echo There are $# comand line arguments

echo They are $

echo Shifting two arguments

shift 2; final_args=$

echo Original arguments are $orig_args

echo Final arguments are $final_args

shift命令會重新分配命令列引數對應位置引數,在shift n以後,所有的中的引數會向左移動n個位置。同時$#會減n。預設的n為1。Shift命令不會影響到引數0的位置。一旦你完成一次移動,被移出命令列的引數會丟失。如果你想在你的程式中引用這個引數,你需要在執行shift之前存貯這個引數到一個變數中。

Shift命令可以用於:存取一組引數的位置,例如一系列的x,y的座標

從命令列刪除命令選項,假定選項在引數之前。

例子:

$ color5 red green yellow orange black

There are 6 command line arguments

They are red green yellow blue orange black

Shifting two arguments

There are 4 command line arguments

They are yellow blue orange black

Shiftging two arguments

Original arguments are red green yellow blue orange black

Final argument are orange black



1.7 read 命令

語法:

read variable [variable......]

例子:

$ cat color6

echo This program prompts for user input

echo “please enter your favorite two colors - c”

read color_a color_b

echo The colors you entered are $color_b $color_a

$ chmod +x color6

$ color6

This program prompts for user input

Please enter your favorite two colors - red blue

The colors you entered are blue red

$ color6

This program prompts for user input

Please enter you favorite two colors - red blue tan

The color you enterd are blue tan red

如果使用命令列引數傳遞資訊程式序,在命令執行之前使用者必須知道正確的語法。有一種情況,你想要在使用者執行程式的時候提示他輸入這些引數。read命令就是用來在程式執行的時候收集終端鍵入的資訊。

通常會使用echo命令來給使用者一個提示,讓他知道程式正在等待一些輸入,同時通知使用者應該輸入的型別。因此,每一個read命令應該在echo命令後面。

read命令會給出一個變數名的列表,使用者在提示符下輸入會給這些變數賦值(變數之間以空格分隔)。如果read命令定義的變數比輸入的詞要多,多出的變數會被賦空值。如果使用者輸入的詞要比變數多,剩餘的資料會賦給列表中的最後一個變數。

一旦被賦值,你就可以象其他的shell變數一樣存取這些變數。

注意:不要混淆位置引數和變數read。位置引數在命令被啟用時直接在命令列中使用,而read命令給變數賦值是在程式執行之中,使用者響應輸入的提示而給變數賦值。

以下例子提示使用者輸入要被安裝的檔名:

$ cat my_install3

echo $0 will install files into your bin directory

echo “Enter the names of the files - c”

read filenames

mv $filenames $HOMEbin

echo Instllation is complete

ctrl + d

$ chmod +x my_install13

$ my_install13

my_install13 will install files into your bin directory

Enter the names of the files - f1 f2

Installaton is complete

這個安裝指令碼會提示使用者輸入需要chmod並移動到$HOMEbin的檔案的檔名。這個程式給使用者更多的關於應該輸入資料情況的指引。而不像install2中使用者必須在命令列中提供檔名,使用者使用程式不需要特殊的語法,程式讓使用者確切地知道要輸入什麼。所有的輸入的檔名都會被賦值給變數filenames。

1.8 另外的技術

#號開始的文件為註釋部分。

sh shell_program argumetns?
shell_program 的屬性可以不是可執行的。
shell_program 必須是可讀的。

sh –x shell_program arguments
每一行在被執行前被列印出來。
在除錯程式時有用處。

在shell程式中,#符號的意思是後面是一段註釋,而shell會自動忽略#符號以後直到一個回車符號為止的所有字元。

執行一個shell程式的另外一種方法是

sh shell_program arguments

這種方式啟用一個子shell並且指定這個子shell為執行這個程式的命令直譯器。這個程式檔案的屬性不一定必須為可執行。這種方式的用途在:你正在在一種shell下工作,同時想要執行用其他shell命令語言寫的shell程式十分有用。

你也可以在你的shell程式的第一行前加入! usrbin shell_name來指定命令列直譯器,這樣如果你當前正在POSIX shell下工作,但是想要執行一個C shell的指令碼,你的C shell程式的第一行應該為:

#!usrbincsh

雖然shell程式沒有偵錯程式,命令:

sh –x shell_program arguments

會在執行每一行時,先在螢幕上列印出shell程式的每一行。這允許你看到shell如何進行檔名產生,變數替代,和命令替代。這個選項對發現打字錯誤十分有幫助。
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/503782/viewspace-983114/,如需轉載,請註明出處,否則將追究法律責任。

相關文章