● 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...