?? 4.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"> <META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富國,http://winking.126.com"> <TITLE>管理腳本語言</TITLE></HEAD><BODY style="font-family: 宋體; font-size: 9pt"> <CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" ><TR><TD ALIGN=CENTER><FONT SIZE=+2><!--標題由此開始-->管理腳本語言</TD></TR></TABLE></CENTER><p><h3>目 錄</h3><!--目錄由此開始--><A NAME="Content" ID="Content"></A><OL><LI><A HREF="#I112">管理腳本語言</A></LI><OL><LI><A HREF="#I113">bash</A></LI><OL><LI><A HREF="#I114">變量和運算</A></LI><LI><A HREF="#I115">輸入輸出</A></LI><LI><A HREF="#I116">流程控制</A></LI><LI><A HREF="#I117">函數(shù)</A></LI><LI><A HREF="#I118">bash快捷鍵</A></LI></OL><LI><A HREF="#I119">gawk</A></LI><OL><LI><A HREF="#I120">文件、記錄和字段</A></LI><LI><A HREF="#I121">模式和動作</A></LI><LI><A HREF="#I122">運算</A></LI><LI><A HREF="#I123">內(nèi)部函數(shù)</A></LI><LI><A HREF="#I124">字符串和數(shù)字</A></LI><LI><A HREF="#I125">元字符</A></LI><LI><A HREF="#I126">調(diào)用gawk程序</A></LI><LI><A HREF="#I127">BEGIN和END</A></LI><LI><A HREF="#I128">變量</A></LI><LI><A HREF="#I129">控制結構</A></LI><LI><A HREF="#I130">數(shù)組</A></LI><LI><A HREF="#I131">自定義函數(shù)</A></LI><LI><A HREF="#I132">幾個實例</A></LI></OL><LI><A HREF="#I133">Perl</A></LI><OL><LI><A HREF="#I134">變量</A></LI><LI><A HREF="#I135">文件操作</A></LI><LI><A HREF="#I136">流程控制</A></LI><LI><A HREF="#I137">字符匹配</A></LI><LI><A HREF="#I138">子過程</A></LI><LI><A HREF="#I139">例子</A></LI></OL><LI><A HREF="#I140">正則表達式</A></LI></OL></OL><hr><br><A NAME="I112" ID="I112"></A><center><b><font size=+2>管理腳本語言</font></b></center><br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I113" ID="I113"></A><center><b><font size=+2>bash</font></b></center><br>最簡單的例子 —— Hello World!<br>幾乎所有的講解編程的書給讀者的第一個例子都是 Hello World 程序,那么我們今天也就從這個例子出發(fā),來逐步了解 BASH。<p>用 vi 編輯器編輯一個 hello 文件如下:<p>#!/bin/bash<br># This is a very simple example<br>echo Hello World<p>這樣最簡單的一個 BASH 程序就編寫完了。這里有幾個問題需要說明一下:<p>一,第一行的 #! 是什么意思<br>二,第一行的 /bin/bash 又是什么意思<br>三,第二行是注釋嗎<br>四,echo 語句<br>五,如何執(zhí)行該程序<p>#! 是說明 hello 這個文件的類型的,有點類似于 Windows 系統(tǒng)下用不同文件后綴來表示不同文件類型的意思(但不相同)。Linux 系統(tǒng)根據(jù) "#!" 及該字串后面的信息確定該文件的類型,關于這一問題同學們回去以后可以通過 "man magic"命令 及 /usr/share/magic 文件來了解這方面的更多內(nèi)容。在 BASH 中 第一行的 "#!" 及后面的 "/bin/bash" 就表明該文件是一個 BASH 程序,需要由 /bin 目錄下的 bash 程序來解釋執(zhí)行。BASH 這個程序一般是存放在 /bin 目錄下,如果你的 Linux 系統(tǒng)比較特別,bash 也有可能被存放在 /sbin 、/usr/local/bin 、/usr/bin 、/usr/sbin 或 /usr/local/sbin 這樣的目錄下;如果還找不到,你可以用 "locate bash" "find / -name bash 2> /dev/null" 或 "whereis bash" 這三個命令找出 bash 所在的位置;如果仍然找不到,那你可能需要自己動手安裝一個 BASH 軟件包了。<p>第二行的 "# This is a ..." 就是 BASH 程序的注釋,在 BASH 程序中從“#”號(注意:后面緊接著是“!”號的除外)開始到行尾的多有部分均被看作是程序的注釋。的三行的 echo 語句的功能是把 echo 后面的字符串輸出到標準輸出中去。由于 echo 后跟的是 "Hello World" 這個字符串,因此 "Hello World"這個字串就被顯示在控制臺終端的屏幕上了。需要注意的是 BASH 中的絕大多數(shù)語句結尾處都沒有分號。<p>如何執(zhí)行該程序呢?有兩種方法:一種是顯式制定 BASH 去執(zhí)行:<p>$ bash hello 或<br>$ sh hello (這里 sh 是指向 bash 的一個鏈接,“l(fā)rwxrwxrwx 1 root root 4 Aug 20 05:41 /bin/sh -> bash”)<p>或者可以先將 hello 文件改為可以執(zhí)行的文件,然后直接運行它,此時由于 hello 文件第一行的 "#! /bin/bash" 的作用,系統(tǒng)會自動用/bin/bash 程序去解釋執(zhí)行 hello 文件的:<p>$ chmod u+x hello<br>$ ./hello<p>此處沒有直接 “$ hello”是因為當前目錄不是當前用戶可執(zhí)行文件的默認目錄,而將當前目錄“.”設為默認目錄是一個不安全的設置。<p>需要注意的是,BASH 程序被執(zhí)行后,實際上 Linux 系統(tǒng)是另外開設了一個進程來運行的。<p><p><p><p><br><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I114" ID="I114"></A><center><b><font size=+2>變量和運算</font></b></center><br> 我們先來從整體上把握一下 BASH 中變量的用法,然后再去分析 BASH 中變量使用與 C 語言中的不同。BASH 中的變量都是不能含有保留字,不能含有 "-" 等保留字符,也不能含有空格。<p>簡單變量<br> 在 BASH 中變量定義是不需要的,沒有 "int i" 這樣的定義過程。如果想用一個變量,只要他沒有在前面被定義過,就直接可以用,當然你使用該變量的第一條語句應該是對他賦初值了,如果你不賦初值也沒關系,只不過該變量是空( 注意:是 NULL,不是 0 )。不給變量賦初值雖然語法上不反對,但不是一個好的編程習慣。好了我們看看下面的例子:<p> 首先用 vi 編輯下面這個文件 hello2:<p>#!/bin/bash<br># give the initialize value to STR<br>STR="Hello World"<br>echo $STR<p> 在上面這個程序中我們需要注意下面幾點:<p> 一,變量賦值時,'='左右兩邊都不能有空格;<br> 二,BASH 中的語句結尾不需要分號(";");<br> 三,除了在變量賦值和在FOR循環(huán)語句頭中,BASH 中的變量使用必須在變量前加"$"符號,同學們可以將上面程序中第三行改為 "echo STR" 再試試,看看會出什么結果。<br> 四,由于 BASH 程序是在一個新的進程中運行的,所以該程序中的變量定義和賦值不會改變其他進程或原始 Shell 中同名變量的值,也不會影響他們的運行。<p> 更細致的文檔甚至提到以但引號括起來的變量將不被 BASH 解釋為變量,如 '$STR' ,而被看成為純粹的字符串。而且更為標準的變量引用方式是 ${STR} 這樣的,$STR 自不過是對 ${STR} 的一種簡化。在復雜情況下(即有可能產(chǎn)生歧義的地方)最好用帶 {} 的表示方式。<p> BASH 中的變量既然不需要定義,也就沒有類型一說,一個變量即可以被定義為一個字符串,也可以被再定義為整數(shù)。如果對該變量進行整數(shù)運算,他就被解釋為整數(shù);如果對他進行字符串操作,他就被看作為一個字符串。請看下面的例子:<p>#!/bin/bash<br>x=1999<br>let "x = $x + 1"<br>echo $x<br>x="olympic'"$x<br>echo $x<p> 關于整數(shù)變量計算,有如下幾種:" + - * / % ",他們的意思和字面意思相同。整數(shù)運算一般通過 let 和 expr 這兩個指令來實現(xiàn),如對變量 x 加 1 可以寫作:let "x = $x + 1" 或者 x=`expr $x + 1`<p> 在比較操作上,整數(shù)變量和字符串變量各不相同,詳見下表:<p>對應的操作 整數(shù)操作 字符串操作<br>相同 -eq =<br>不同 -ne !=<br>大于 -gt ><br>小于 -lt <<br>大于或等于 -ge<br>小于或等于 -le<br>為空 -z<br>不為空 -n<p><br>比如:<p> 比較字符串 a 和 b 是否相等就寫作:if [ $a = $b ]<br> 判斷字符串 a 是否為空就寫作: if [ -z $a ]<br> 判斷整數(shù)變量 a 是否大于 b 就寫作:if [ $a -gt $b ]<p> 更細致的文檔推薦在字符串比較時盡量不要使用 -n ,而用 ! -z 來代替。(其中符號 "!" 表示求反操作)<p> BASH 中的變量除了用于對 整數(shù) 和 字符串 進行操作以外,另一個作用是作為文件變量。BASH 是 Linux 操作系統(tǒng)的 Shell,因此系統(tǒng)的文件必然是 BASH 需要操作的重要對象,如 if [ -x /root ] 可以用于判斷 /root 目錄是否可以被當前用戶進入。下表列出了 BASH 中用于判斷文件屬性的操作符:<p> 運算符 含義( 滿足下面要求時返回 TRUE )<p>-e file 文件 file 已經(jīng)存在<br>-f file 文件 file 是普通文件<br>-s file 文件 file 大小不為零<br>-d file 文件 file 是一個目錄<br>-r file 文件 file 對當前用戶可以讀取<br>-w file 文件 file 對當前用戶可以寫入<br>-x file 文件 file 對當前用戶可以執(zhí)行<br>-g file 文件 file 的 GID 標志被設置<br>-u file 文件 file 的 UID 標志被設置<br>-O file 文件 file 是屬于當前用戶的<br>-G file 文件 file 的組 ID 和當前用戶相同<br>file1 -nt file2 文件 file1 比 file2 更新<br>file1 -ot file2 文件 file1 比 file2 更老<p><br>注意:上表中的 file 及 file1、file2 都是指某個文件或目錄的路徑。<p>關于局部變量<br> 在 BASH 程序中如果一個變量被使用了,那么直到該程序的結尾,該變量都一直有效。為了使得某個變量存在于一個局部程序塊中,就引入了局部變量的概念。BASH 中,在變量首次被賦初值時加上 local 關鍵字就可以聲明一個局部變量,如下面這個例子:<p>#!/bin/bash<br>HELLO=Hello<br>function hello {<br> local HELLO=World<br> echo $HELLO<br>}<br>echo $HELLO<br>hello<br>echo $HELLO<p>該程序的執(zhí)行結果是:<p>Hello<br>World<br>Hello<p>這個執(zhí)行結果表明全局變量 $HELLO 的值在執(zhí)行函數(shù) hello 時并沒有被改變。也就是說局部變量 $HELLO 的影響只存在于函數(shù)那個程序塊中。<p>BASH 中的變量與 C 語言中變量的區(qū)別<br> 這里我們?yōu)樵瓉聿皇煜?BASH 編程,但是非常熟悉 C 語言的程序員總結一下在 BASH 環(huán)境中使用變量需要注意的問題。<p> 1,BASH 中的變量在引用時都需要在變量前加上 "$" 符號( 第一次賦值及在For循環(huán)的頭部不用加 "$"符號 );<br> 2,BASH 中沒有浮點運算,因此也就沒有浮點類型的變量可用;<br> 3,BASH 中的整形變量的比較符號與 C 語言中完全不同,而且整形變量的算術運算也需要經(jīng)過 let 或 expr 語句來處理;<p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I115" ID="I115"></A><center><b><font size=+2>輸入輸出</font></b></center><br>關于輸入、輸出和錯誤輸出<br> 在字符終端環(huán)境中,標準輸入/標準輸出的概念很好理解。輸入即指對一個應用程序或命令的輸入,無論是從鍵盤輸入還是從別的文件輸入;輸出即指應用程序或命令產(chǎn)生的一些信息;與 Windows 系統(tǒng)下不同的是,Linux 系統(tǒng)下還有一個標準錯誤輸出的概念,這個概念主要是為程序調(diào)試和系統(tǒng)維護目的而設置的,錯誤輸出于標準輸出分開可以讓一些高級的錯誤信息不干擾正常的輸出信息,從而方便一般用戶的使用。<p> 在 Linux 系統(tǒng)中:標準輸入(stdin)默認為鍵盤輸入;標準輸出(stdout)默認為屏幕輸出;標準錯誤輸出(stderr)默認也是輸出到屏幕(上面的 std 表示 standard)。在 BASH 中使用這些概念時一般將標準輸出表示為 1,將標準錯誤輸出表示為 2。下面我們舉例來說明如何使用他們,特別是標準輸出和標準錯誤輸出。<p> 輸入、輸出及標準錯誤輸出主要用于 I/O 的重定向,就是說需要改變他們的默認設置。先看這個例子:<p>$ ls > ls_result<br>$ ls -l >> ls_result<p> 上面這兩個命令分別將 ls 命令的結果輸出重定向到 ls_result 文件中和追加到 ls_result 文件中,而不是輸出到屏幕上。">"就是輸出(標準輸出和標準錯誤輸出)重定向的代表符號,連續(xù)兩個 ">" 符號,即 ">>" 則表示不清除原來的而追加輸出。下面再來看一個稍微復雜的例子:<p>$ find /home -name lost* 2> err_result<p> 這個命令在 ">" 符號之前多了一個 "2","2>" 表示將標準錯誤輸出重定向。由于 /home 目錄下有些目錄由于權限限制不能訪問,因此會產(chǎn)生一些標準錯誤輸出被存放在 err_result 文件中。大家可以設想一下 find /home -name lost* 2>>err_result 命令會產(chǎn)生什么結果?<p> 如果直接執(zhí)行 find /home -name lost* > all_result ,其結果是只有標準輸出被存入 all_result 文件中,要想讓標準錯誤輸出和標準輸入一樣都被存入到文件中,那該怎么辦呢?看下面這個例子:<p>$ find /home -name lost* > all_result 2>& 1<p> 上面這個例子中將首先將標準錯誤輸出也重定向到標準輸出中,再將標準輸出重定向到 all_result 這個文件中。這樣我們就可以將所有的輸出都存儲到文件中了。為實現(xiàn)上述功能,還有一種簡便的寫法如下:<p>$ find /home -name lost* >& all_result<p> 如果那些出錯信息并不重要,下面這個命令可以讓你避開眾多無用出錯信息的干擾:<p>$ find /home -name lost* 2> /dev/null<p> 同學們回去后還可以再試驗一下如下幾種重定向方式,看看會出什么結果,為什么?<p>$ find /home -name lost* > all_result 1>& 2<br>$ find /home -name lost* 2> all_result 1>& 2<br>$ find /home -name lost* 2>& 1 > all_result<p> 另外一個非常有用的重定向操作符是 "-",請看下面這個例子:<p>$ (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)<p> 該命令表示把 /source/directory 目錄下的所有文件通過壓縮和解壓,快速的全部移動到 /dest/directory 目錄下去,這個命令在 /source/directory 和 /dest/directory 不處在同一個文件系統(tǒng)下時將顯示出特別的優(yōu)勢。<p>下面還幾種不常見的用法:<p>n<&- 表示將 n 號輸入關閉<br><&- 表示關閉標準輸入(鍵盤)<br>n>&- 表示將 n 號輸出關閉<br>>&- 表示將標準輸出關閉<p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I116" ID="I116"></A><center><b><font size=+2>流程控制</font></b></center><br>BASH 中的基本流程控制語法<br> BASH 中幾乎含有 C 語言中常用的所有控制結構,如條件分支、循環(huán)等,下面逐一介紹。<p>if...then...else<br> if 語句用于判斷和分支,其語法規(guī)則和 C 語言的 if 非常相似。其幾種基本結構為:<p>if [ expression ]<br>then<br> statments<br>fi<p>或者<p>if [ expression ]<br>then<br> statments<br>else<br> statments<br>fi<p>或者<p>if [ expression ]<br>then<br> statments<br>else if [ expression ]<br> then<br> statments<br> else<br> statments<br>fi<p>或者<p>if [ expression ]<br>then<br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -