一個簡單的shell程式
下面直接來看一個shell程式。
-----------------
#!/bin/sh# This is to show what a example looks like.echo "Our first example"echo # This inserts an empty line in outputecho "We are currently in the following directory."/bin/pwdechoecho "This directory contains the following files"/bin/ls
shell結構:
#!/bin/sh
表示下面指令碼要使用系統中的Bourne shell解譯器來解釋執行。#!是特殊的表示符,其後面根的是此解釋此指令碼的shell的路徑。
# 注釋行
本行內容起注釋作用,內容不會被執行
echo 輸出語句
相當於編程裡print列印輸出
/bin/pwd 顯示當前路徑
pwd你會常用,前面加/bin/表示這個命令的絕對路徑
/bin/ls 顯示目前的目錄下的內容
這個就不解釋,玩linux這個應該是最先要知道的。
下面執行一下:
[root@bogon bin]# sh exple.sh
Out first example ---列印內容
we are currently in the following directory. ---列印內容
/bin ---顯示當前路徑
this directory contains the following files-----列印內容
alsaunmute date gettext mail red touch ---顯示目前的目錄下的檔案
arch dd grep mailx rm tracepath
ash df gtar mkdir rmdir tracepath6
ash.static dmesg gunzip mknod rpm traceroute
aumix-minimal dnsdomainname gzip mktemp rvi traceroute6
awk doexec hostname more rview true
basename domainname igawk mount sed exple.sh
很簡單,這就是一個最簡單的shell編程,只不過是把我平時用的一些命令整合到一起。不知道你是熟悉DOS下的批處理。他們類似,都是把我們平操作的一組命令放到一起執行。shell是一個解釋性的語言。
其實我們會發現這樣的編程對我們系統的依賴性比較強。比如:/bin/pwd 執行pwd命令,假如在你的系統上pwd不是放在bin/目錄下,那麼程式運行到這裡可能就會出錯了。
比較正規的解釋:
Shell基本上是一個命令直譯器,類似於DOS下的command.com。它接收使用者命令(如ls等),然後調用相應的應用程式。較為通用的shell有標準的Bourne shell (sh)和C shell (csh)。
互動式shell和非互動式shell
互動式模式就是shell等待你的輸入,並且執行你提交的命令。這種模式被稱作互動式是因為shell與使用者進行互動。這種模式也是大多數使用者非常熟悉的:登入、執行一些命令、簽退。當你簽退後,shell也終止了。
shell也可以運行在另外一種模式:非互動式模式。在這種模式下,shell不與你進行互動,而是讀取存放在檔案中的命令,並且執行它們。當它讀到檔案的結尾,shell也就終止了。
建立shell程式的步驟:
第一步:建立一個包含命令和控制結構的檔案。
第二步:修改這個檔案的許可權使它可以執行。
當然,一個使用者要執行一個檔案,那麼它對這個檔案一定有執行許可權。
使用“ chmod u+x ”命令給使用者加執行許可權
第三步:執行 ./example 在目前的目錄直接執行檔案
也可以使用“sh example”命令來執行
shell 變數
我們對shell是不是有了初步的認識,那麼它只是簡單的命令集合嗎?no!身為一門語言,他當然也有自己的文法。如下你懂任何一門語言的話,下面來看shell與你所知道的語言有什麼不同。
變數:是shell傳遞資料的一種方法,用來代表每個取值的符號名。
shell有兩種類變數:臨時變數和永久變數
臨時變數是shell程式內部定義的,其使用範圍僅限於定義它的程式,對其它程式不可見。
包括:使用者定義變數、位置變數。
使用者自訂變數的格式要求:
由字每或底線開頭,由字母、數字或底線序列組成,並且大小寫字母意義不同。變數名長度沒有限制。
在使用變數時,要在變數名前加上首碼“$”(我記得php就特鐘愛這個符號^_^)
一般變數名會用大寫字元
如:
MUM=100 定義時賦值
TIME=$(date)將一個命令的執行結果賦值給變數,
A=$B將一個變數複製給另一個變數
定義並查看一個變數:
[root@bogon ~]# NUM=100
[root@bogon ~]# echo $NUM
100
[root@bogon ~]# TIME=$(date)
[root@bogon ~]# echo $TIME
五 6月 1 22:57:28 CST 2012
[root@bogon ~]# B=fnngj
[root@bogon ~]# echo $B
fnngj
[root@bogon ~]# A=$B
[root@bogon ~]# echo $A
fnngj
永久變數是環境變數,其值不隨shell指令碼的執行結束而消失。
[root@bogon ~]# echo $LANG
zh_CN.UTF-8
[root@bogon ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
上面這些系統配置肯定不會隨著我shell程式結束而消失。
看一下我們系統中都定義的哪些變數:
[root@bogon ~]# set | more
A=fnngj
B=fnngj
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="00" [2]="15" [3]="1" [4]="release" [5]="i686-redhat-
linux-gnu")
BASH_VERSION='3.00.15(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
.............
刪除變數:
[root@bogon ~]# unset A
執行unset命令就可以將一個變數刪除
read 命令
這個命令比較有意思,但在變成中也很常見,比如程式運行到某一句時停下來要求使用者輸入內容,然後根據使用者輸入的內容繼續執行。
read命令:從鍵盤讀入資料,賦值給變數
如:read USERNSME
[root@bogon shell]# touch read.sh
[root@bogon shell]# vi read.sh
#! /bin/shread first second thirdecho "the first parameter is $first"echo "the second parameter is $second"echo "the third parameter is $third"
[root@bogon shell]# sh read.sh
100 200 300 ---------------此處要求使用者輸入參數
the first parameter is 100
the second parameter is 200
the third parameter is 300
shell變數的算術運算
算術運算也是我們在經常使用到的,下面我們來看shell 簡單的加減乘除。
expr命令:對整數型變數進行算術運算
例如:
[root@localhost ~]# expr 3+5
3+5
[root@localhost ~]# expr 3 + 5
8
[root@localhost ~]# expr 9 - 5
4
[root@localhost ~]# expr 9 / 5
1
[root@localhost ~]# expr 9 \* 5
45
這個除法就是整除,所以9除5等於1,直接把餘下的4忽視了。
這個乘法, 因為星號(*)還有其它含義,如你在尋找時*代表一位未知字元,所以要想把它當乘號用,這裡裡要加轉義符號(\)
一個shell執行個體
前面有講到任務計劃,現在我們來根據任務計劃來寫一個有意義的shell程式。
話說一個學校裡有一台很垃圾的apache伺服器,晚上八點到十點訪問這個伺服器的學生很多,然後呢,這個伺服器就經常掛掉,學校呢又沒錢加裝置。現在,我們來寫一個shell程式,讓其每兩分鐘檢測一下apache,如果伺服器掛了呢。就重啟一下。(當然,這並不能從跟本上解決這一問題)
如何判斷一個apache 是否啟動?
[root@bogon bin]# pgrep httpd
7942 7944 7946 7947 7948 7950
如果伺服器已經掛掉的話,輸入pgrep httpd 將沒有任何輸入。
我們已經知道了判斷方法,下面就可以開始寫這個程式了test.apache
-------------------------------
#!/bin/sh#"if....else" usage# using this program to show your system's service.echo "now, the web services of this linux system will be detect..."echo # Detesct www serviceweb='/usr/bin/pgrep httpd'if["$web"!=""]thenecho "the web sercice is running."elseecho "the web sercice is running."/etc/rc.d/init.d/httpd startfi
-----------------------------------
其實,核心內容就是判斷pgrep httpd 為空白的執行重啟命令。^_^!
關於任務計劃,在《linux那點事兒(六)---進程管理詳解》一章有介紹。
關於上面參數的含義:http://www.cnblogs.com/fnng/archive/2012/05/20/2510641.html
[root@bogon test]# crontab -e
*/2 20-22 * * 1-7 test.apache
:wq!
儲存退出。
然後,就沒我們什麼事兒了。根據計劃執行指令碼。呵呵!
--------------------------------------------------------------------------------------------------------
後記:
關於shell編程,我這裡介紹的很少,甚至連迴圈語句(if....else )都沒有介紹。最後一個例子中有使用。shell編程可以是一本很厚很厚的書。不過,它不是我目前學習重點。有時間的話,我會再補充一篇shell的內容。
從今年年初開始學習linux到現在算是告一段落,其實,在學習的過程中遇到了很多問題。這個《linux那點事兒》只是把我學習的主線內容整理了下來。很高興從基本上的一竅不通到現在對linux略知一二,不過,這個學習,我覺得用得時間太長了,也許我可以在一兩月就稿點。可以今年經曆了一次從北方到南方的換工作,而且現在的工作很忙,生活中各種瑣事太多。所以,學習時間好少。不過,我會堅持在這裡繼續書寫著自己的工作和與學習。
下面的學習,我會放在兩個方面oracle 和效能測試。
我一直是個資料庫白癡,並對資料庫基本沒有興趣。但它是我技術發展的短板,所以,我想花一點兒時間補習一下這方面知識。
效能測試一直是我喜歡的方面。目前的工作沒有效能測試。但上一份工作中有做過效能。下個目標就是去做專業的效能測試。loadrunner和jmeter都有玩過。不過,我現在會把重點放在理論基礎上,效能測試的重點不在工具,涉及的知識面很多。略有所悟的話也會記錄在這裡。呵呵!