歡迎您光臨本站 註冊首頁

介紹shell編程

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

目標:

完成這一章,你能做以下事情:

寫出基本的shell程序
通過環境變數傳遞參數給shell程序
通過位置參數傳遞參數給shell程序
使用特殊shell變數,*和#
使用shift和read命令

1.1 shell編程概述

shell程序是一個包含UNIX命令的普通文件。
這個文件的許可許可權至少應該為可讀和可執行。
在shell提示符下鍵入文件名就可執行shell程序。
數據可以通過三種方式傳送到shell程序
??-環境變數

??-命令行參數

??-用戶的輸入


shell是一個命令解釋器,它會解釋你在命令提示符下輸入的命令。但是,你可能有一組想要多次執行的命令。shell提供了一種功能,讓你將這組命令存放在一個文件中,然後你可以象unix系統提供的其他程序一樣執行這個文件。這個命令文件就叫做shell程序或者shell腳本。當你運行這個文件,它會象你在命令行輸入這些命令一樣地執行這些命令。

為了讓shell讀取你的shell程序並且執行,shell必須能夠讀取並能夠執行每一行命令。因此,shell腳本的許可許可權必須被設置為可讀和可執行。為了讓shell可以找到你的程序,你可以選擇輸入完全路徑名,或者將這個腳本的路徑放在於你的PATH環境變數指定的路徑列表中。許多的用戶會在他們的HOME目錄下創建一個bin目錄來存放他們自己開發的script,然後將$HOME/bin加入到他們的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 11:10 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會一直保存程序或命令的名字




1.4 shell程序的參數(繼續)




以下的shell程序會安裝一個程序,這個程序作為一個命令行參數被安裝到你的bin目錄:首先創建程序my_install,注意目錄$HOME/bin應該預先存在。


$ cat > my_install

echo $0 will install $1 to your bin directory

chmod +x $1

mv $1 $HOME/bin

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等等來獨立的檢索這些參數。




1.5 一些特殊的shell變數-#和*(繼續)

一個可以接收多個命令行參數的安裝程序的例子:

$ cat > my_install2

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

echo The files to be installed are : $*

chmod +x $*

mv $* $HOME/bin

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命令給變數賦值是在程序執行之中,通過對輸入提示的響應而給變數賦值。




1.7 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 $HOME/bin

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和移動到$HOME/bin的文件名。這個程序給用戶更多的關於應該輸入數據情況的指引。而不像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程序的第一行前加入#!/usr/bin/ shell_name來指定命令行解釋器。因此,如果你當前正在POSIX shell下工作,但是想要執行一個C shell的腳本,你的C shell程序的第一行應該為:

#!/usr/bin/csh


雖然shell程序沒有調試器,命令:

sh ?x shell_program arguments

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

[火星人 ] 介紹shell編程已經有506次圍觀

http://coctec.com/docs/linux/show-post-137386.html