




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Linux主要shell命令詳解shell是用戶和Linux操作系統之間的接口。Linux中有多種shell,其中缺省使用的是Bash。本章講述了shell的工作原理,shell的種類,shell的一般操作及Bash的特性。 什么是shell Linux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的接口。它是命令語言、命令解釋程序及程序設計語言的統稱。 shell是用戶和Linux內核之間的接口程序,如果把Linux內核想象成一個球體的中心,shell就是圍繞內核的外層。當從shell或其他程序向Linux傳遞命令時,內核會做出相應的反應。 shell是一個命令語言解釋器,它擁有
2、自己內建的shell命令集,shell也能被系統中其他應用程序所調用。用戶在提示符下輸入的命令都由shell先解釋然后傳給Linux核心。 有一些命令,比如改變工作目錄命令cd,是包含在shell內部的。還有一些命令,例如拷貝命令cp和移動命令rm,是存在于文件系統中某個目錄下的單獨的程序。對用戶而言,不必關心一個命令是建立在shell內部還是一個單獨的程序。 shell首先檢查命令是否是內部命令,若不是再檢查是否是一個應用程序(這里的應用程序可以是Linux本身的實用程序,如ls和rm,也可以是購買的商業程序,如xv,或者是自由軟件,如emacs)。然后shell在搜索路徑里尋找這些應用程序
3、(搜索路徑就是一個能找到可執行程序的目錄列表)。如果鍵入的命令不是一個內部命令并且在路徑里沒有找到這個可執行文件,將會顯示一條錯誤信息。如果能夠成功找到命令,該內部命令或應用程序將被分解為系統調用并傳給Linux內核。 shell的另一個重要特性是它自身就是一個解釋型的程序設計語言,shell程序設計語言支持絕大多數在高級語言中能見到的程序元素,如函數、變量、數組和程序控制結構。shell編程語言簡單易學,任何在提示符中能鍵入的命令都能放到一個可執行的shell程序中。 當普通用戶成功登錄,系統將執行一個稱為shell的程序。正是shell進程提供了命令行提示符。作為默認值(TurboLinu
4、x系統默認的shell是BASH),對普通用戶用“$”作提示符,對超級用戶(root)用“#”作提示符。 一旦出現了shell提示符,就可以鍵入命令名稱及命令所需要的參數。shell將執行這些命令。如果一條命令花費了很長的時間來運行,或者在屏幕上產生了大量的輸出,可以從鍵盤上按ctrl+c發出中斷信號來中斷它(在正常結束之前,中止它的執行)。 當用戶準備結束登錄對話進程時,可以鍵入logout命令、exit命令或文件結束符(EOF)(按ctrl+d實現),結束登錄。 我們來實習一下shell是如何工作的。 $ make work make:*No rule to make target wor
5、k. Stop. $ 注釋:make是系統中一個命令的名字,后面跟著命令參數。在接收到這個命令后,shell便執行它。本例中,由于輸入的命令參數不正確,系統返回信息后停止該命令的執行。 在例子中,shell會尋找名為make的程序,并以work為參數執行它。make是一個經常被用來編譯大程序的程序,它以參數作為目標來進行編譯。在 “make work”中,make編譯的目標是work。因為make找不到以work為名字的目標,它便給出錯誤信息表示運行失敗,用戶又回到系統提示符下。 另外,用戶鍵入有關命令行后,如果shell找不到以其中的命令名為名字的程序,就會給出錯誤信息。例如,如果用戶鍵入:
6、 $ myprog bash:myprog:command not found $ 可以看到,用戶得到了一個沒有找到該命令的錯誤信息。用戶敲錯命令后,系統一般會給出這樣的錯誤信息。 shell的種類 Linux中的shell有多種類型,其中最常用的幾種是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三種shell各有優缺點。Bourne shell是UNIX最初使用的shell,并且在每種UNIX上都可以使用。Bourne shell在shell編程方面相當優秀,但在處理與用戶的交互方面做得不如其他幾種shell。Linux操作系統缺省的shell
7、是Bourne Again shell,它是Bourne shell的擴展,簡稱Bash,與Bourne shell完全向后兼容,并且在Bourne shell的基礎上增加、增強了很多特性。Bash放在/bin/bash中,它有許多特色,可以提供如命令補全、命令編輯和命令歷史表等功能,它還包含了很多C shell和Korn shell中的優點,有靈活和強大的編程接口,同時又有很友好的用戶界面。 C shell是一種比Bourne shell更適于編程的shell,它的語法與C語言很相似。 Linux為喜歡使用C shell的人提供了Tcsh。Tcsh是C shell的一個擴展版本。Tcsh包括
8、命令行編輯、可編程單詞補全、拼寫校正、歷史命令替換、作業控制和類似C語言的語法,它不僅和Bash shell是提示符兼容,而且還提供比Bash shell更多的提示符參數。 Korn shell集合了C shell和Bourne shell的優點并且和Bourne shell完全兼容。Linux系統提供了pdksh(ksh的擴展),它支持任務控制,可以在命令行上掛起、后臺執行、喚醒或終止程序。 Linux并沒有冷落其他shell用戶,還包括了一些流行的shell如ash、zsh等。每個shell都有它的用途,有些shell是有專利的,有些能從Internet網上或其他來源獲得。要決定使用哪個s
9、hell,只需讀一下各種shell的聯機幫助,并試用一下。 用戶在登錄到Linux時由/etc/passwd文件來決定要使用哪個shell。例如: # fgrep lisa /etc/passwd lisa:x:500:500:TurboLinux User:/home/lisa:/bin/bash shell被列每行的末尾(/bin/bash)。 由于Bash是Linux上缺省的shell,本章主要介紹Bash及其相關知識。 shell命令 命令行c 用戶登錄到Linux系統時,可以看到一個shell提示符,標識了命令行的開始。用戶可以在提示符后面輸入任何命令及參數。例如: $ date 二
10、 11 23 01:34:58 CST 1999 $ 用戶登錄時,實際進入了shell,它遵循一定的語法將輸入的命令加以解釋并傳給系統。命令行中輸入的第一個字必須是一個命令的名字,第二個字是命令的選項或參數,命令行中的每個字必須由空格或TAB隔開,格式如下: $ Command Option Arguments 1. 選項和參數 選項是包括一個或多個字母的代碼,它前面有一個減號(減號是必要的,Linux用它來區別選項和參數),選項可用于改變命令執行的動作的類型。例如: $ ls motd passwd $ 這是沒有選項的ls命令,可列出當前目錄中所有文件,只列出各個文件的名字,而不顯示其他更多
11、的信息。 $ ls -l total 2 -rw-r-r- 2 wzh book 22 Apr 20 20:37 motd -rw-r-r- 2 wzh book 796 Apr 20 20:37 passwd $ 加入-l選項,將會為每個文件列出一行信息,諸如數據大小和數據最后被修改的時間。 大多數命令都被設計為可以接納參數。參數是在命令行中的選項之后鍵入的一個或多個單詞,例如: $ ls -l text -rw-r-r- 2 wzh book 22 Apr 20 20:37 motd -rw-r-r- 2 wzh book 796 Apr 20 20:37 passwd $ 將顯示text
12、目錄下的所有文件及其信息。 有些命令,如ls可以帶參數,而有一些命令可能需要一些最小數目的參數。例如,cp命令至少需要兩個參數,如果參數的數目與命令要求不符,shell將會給出出錯信息。例如: $ cp -i mydata newdata 注意:命令行中選項先于參數輸入。 2. 命令行特征 命令行實際上是可以編輯的一個文本緩沖區,在按回車之前,可以對輸入的文本進行編輯。比如利用BACKSPACE鍵可以刪除剛鍵入的字符,可以進行整行刪除,還可以插入字符,使得用戶在輸入命令,尤其是復雜命令時,若出現鍵入錯誤,無須重新輸入整個命令,只要利用編輯操作,即可改正錯誤。 利用上箭頭可以重新顯示剛執行的命令
13、,利用這一功能可以重復執行以前執行過的命令,而無須重新鍵入該命令。 bash保存著以前鍵入過的命令的列表,這一列表被稱為命令歷史表。按動上箭頭,便可以在命令行上逐次顯示各條命令。同樣,按動下箭頭可以在命令列表中向下移動,這樣可以將以前的各條命令顯示在命令行上,用戶可以修改并執行這些命令。這一特征將在10.4節中進行詳細的論述。 在一個命令行中還可以置入多個命令,用分號將各個命令隔開。例如: $ ls -F;cp -i mydata newdata 也可以在幾個命令行中輸入一個命令,用反斜杠將一個命令行持續到下一行。 $ cp i mydata newdata 上面的cp命令是在三行中輸入的,開
14、始的兩行以反斜杠結束,把三行作為一個命令行。 shell中的特殊字符 shell中除使用普通字符外,還可以使用一些具有特殊含義和功能的特殊字符。在使用它們時應注意其特殊的含義和作用范圍。下面分別對這些特殊字符加以介紹。 1. 通配符 通配符用于模式匹配,如文件名匹配、路經名搜索、字符串查找等。常用的通配符有*、?和括在方括號 中的字符序列。用戶可以在作為命令參數的文件名中包含這些通配符,構成一個所謂的“模式串”,在執行過程中進行模式匹配。 * 代表任何字符串(長度可以不等),例如:“f*”匹配以f打頭的任意字符串。但應注意,文件名前的圓點(.)和路經名中的斜線(/)必須顯式匹配。例如“*”不能
15、匹配.file,而“.*”才可以匹配.file。 ? 代表任何單個字符。 代表指定的一個字符范圍,只要文件名中位置處的字符在中指定的范圍之內,那么這個文件名就與這個模式串匹配。方括號中的字符范圍可以由直接給出的字符組成,也可以由表示限定范圍的起始字符、終止字符及中間的連字符(-)組成。例如,f a- d 與f abcd的作用相同。Shell將把與命令行中指定的模式串相匹配的所有文件名都作為命令的參數,形成最終的命令,然后再執行這個命令。 下面我們給出表10-1說明這些通配符的具體含義。 表10-1通配符含義舉例 模式串 意 義 * 當前目錄下所有文件的名稱。 *Text* 當前目錄下所有文件名
16、中包含有Text的文件的名稱。 ab-dm* 當前目錄下所有以a、b、c、d、m開頭的文件的名稱。 ab-dm? 當前目錄下所有以a、b、c、d、m開頭且后面只跟有一個字符的文件的名稱。 /usr/bin/? 目錄/usr/bin下所有名稱為兩個字符的文件的名稱。 特別需要注意的是,連字符“-”僅在方括號內有效,表示字符范圍,如在方括號外面就成為普通字符了。而*和?只在方括號外面是通配符,若出現在方括號之內,它們也失去通配符的能力,成為普通字符了。例如,模式“- a*?abc”中只有一對方括號是通配符,*和?均為普通字符,因此,它匹配的字符串只能是- a*abc和- a?abc。 最后說明一下
17、使用通配符時需要注意的一些問題。由于*、?和對于shell來說具有比較特殊的意義,因此在正常的文件名中不應出現這些字符。特別是在目錄名中不要出現它們,否則Shell匹配起來可能會無窮的遞歸下去。另外要注意的一點是:如果目錄中沒有與指定的模式串相匹配的文件名,那么Shell 將使用此模式串本身作為參數傳給有關命令。這可能就是命令中出現特殊字符的原因所在。 2. 引號 在shell中引號分為三種:單引號,雙引號和反引號。 * 單引號 由單引號括起來的字符都作為普通字符出現。特殊字符用單引號括起來以后,也會失去原有意義,而只作為普通字符解釋。例如: $ string=$PATH $ echo $st
18、ring $PATH $ 可見$保持了其本身的含義,作為普通字符出現。 * 雙引號 “ 由雙引號括起來的字符,除$、和”這幾個字符仍是特殊字符并保留其特殊功能外,其余字符仍作為普通字符對待。對于$來說,就是用其后指定的變量的值來代替這個變量和$;對于而言,是轉義字符,它告訴shell不要對其后面的那個字符進行特殊處理,只當作普通字符即可。可以想見,在雙引號中需要在前面加上的只有四個字符$,和”本身。而對”號,若其前面沒有加,則Shell會將它同前一個”號匹配。 例如,我們假定PATH的值為.:/usr/bin:/bin,輸入如下命令: $ TestString”$PATH”$PATH” $ e
19、cho $TestString .:/usr/bin:/ bin”$PATH $ 讀者可以自己試一下在第二個雙引號之前不加會產生什么結果。 * 反引號 反引號()這個字符所對應的鍵一般位于鍵盤的左上角,不要將其同單引號()混淆。反引號括起來的字符串被shell解釋為命令行,在執行時,shell首先執行該命令行,并以它的標準輸出結果取代整個反引號(包括兩個反引號)部分。例如: $ pwd /home/xyz $ string=”current directory is pwd” $ echo $string current directour is /home/xyz $ shell執行echo
20、命令時,首先執行pwd中的命令pwd,并將輸出結果/home/xyz取代pwd這部分,最后輸出替換后的整個結果。 利用反引號的這種功能可以進行命令置換,即把反引號括起來的執行結果賦值給指定變量。例如: $ today=date $ echo Today is $today Today is Mon Apr 15 16:20:13 CST 1999 $ 反引號還可以嵌套使用。但需注意,嵌套使用時內層的反引號必須用反斜線()將其轉義。例如: $ abc=echo The number of users is who| wc-l $ echo $abc The number of users is
21、5 $ 在反引號之間的命令行中也可以使用shell的特殊字符。Shell為得到中命令的結果,它實際上要去執行中指定的命令。執行時,命令中的特殊字符,如$,”,?等又將具有特殊含義,并且所包含的可以是任何一個合法的Shell命令,如: $ ls note readme.txt Notice Unix.dir $ TestString”echo $HOME ls nN*” $ echo $TestString /home/yxz note Notice $ 其他情況,讀者可自行試之。 1. 注釋符 在shell編程中經常要對某些正文行進行注釋,以增加程序的可讀性。在Shell中以字符“#”開頭的正
22、文行表示注釋行。 此外還有一些特殊字符如:用于輸入/輸出重定向與管道的<、>、<<、> >和|;執行后臺命令的&;命令執行操作符&&和|及表示命令組的將在下面各小節中加以介紹。 標準輸入/輸出和重定向 1. 標準輸入與輸出 我們知道,執行一個shell命令行時通常會自動打開三個標準文件,即標準輸入文件(stdin),通常對應終端的鍵盤;標準輸出文件(stdout)和標準錯誤輸出文件(stderr),這兩個文件都對應終端的屏幕。進程將從標準輸入文件中得到輸入數據,將
23、正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。 我們以cat命令為例,cat命令的功能是從命令行給出的文件中讀取數據,并將這些數據直接送到標準輸出。若使用如下命令: $ cat config 將會把文件config的內容依次顯示到屏幕上。但是,如果cat的命令行中沒有參數,它就會從標準輸入中讀取數據,并將其送到標準輸出。例如: $ cat Hello world Hello world Bye Bye <ctrl+d> $ 用戶輸入的每一行都立刻被cat命令輸出到屏幕上。 另一個例子,命令sort按行讀入文件正文(當命令行中沒有給出文件名時,表示從
24、標準輸入讀入),將其排序,并將結果送到標準輸出。下面的例子是從標準輸入讀入一個采購單,并將其排序。 $ sort bananas carrots apples <ctrl+d> apples bananas carrots $ 這時我們在屏幕上得到了已排序的采購單。 直接使用標準輸入/輸出文件存在以下問題: 輸入數據從終端輸入時,用戶費了半天勁輸入的數據只能用一次。下次再想用這些數據時就得重新輸入。而且在終端上輸入時,若輸入有誤修改起來不是很方便。 輸出到終端屏幕上的信息只能看不能動。我們無法對此輸出作更多處理,如將輸出作為另一命令的輸入進行進一步的處理等。 為了解
25、決上述問題,Linux系統為輸入、輸出的傳送引入了另外兩種機制,即輸入/輸出重定向和管道。 2. 輸入重定向 輸入重定向是指把命令(或可執行程序)的標準輸入重定向到指定的文件中。也就是說,輸入可以不來自鍵盤,而來自一個指定的文件。所以說,輸入重定向主要用于改變一個命令的輸入源,特別是改變那些需要大量輸入的輸入源。 例如,命令wc統計指定文件包含的行數、單詞數和字符數。如果僅在命令行上鍵入: $ wc wc將等待用戶告訴它統計什么,這時shell就好象死了一樣,從鍵盤鍵入的所有文本都出現在屏幕上,但并沒有什么結果,直至按下ctrl+d,wc才將命令結果寫在屏幕上。 如果給出一個文件名作為wc命令
26、的參數,如下例所示,wc將返回該文件所包含的行數、單詞數和字符數。 $ wc /etc/passwd 20 23 726 /etc/passwd $ 另一種把/etc/passwd文件內容傳給wc命令的方法是重定向wc的輸入。輸入重定向的一般形式為:命令<文件名??梢杂孟旅娴拿畎褀c命令的輸入重定向為/etc/passwd文件: $ wc < /etc/passwd 20 23 726 $ 另一種輸入重定向稱為here文檔,它告訴shell當前命令的標準輸入來自命令行。here文檔的重定向操作符使用<<。它將一對分隔符(本例中用deli
27、m表示)之間的正文重定向輸入給命令。下例將一對分隔符delim之間的正文作為wc命令的輸入,統計出正文的行數、單詞數和字符數。 $ wc<<delim >this text forms the content >of the here document,which >continues until the end of >text delimter >delim 4 17 98 在<<操作符后面,任何字符都可以作為正文開始前的分隔符,本例中使用delim作為分隔符。he
28、re文檔的正文一直延續到遇見另一個分隔符為止。第二個分隔符應出現在新行的開頭。這時here文檔的正文(不包括開始和結束的分隔符)將重新定向送給命令wc作為它的標準輸入。 由于大多數命令都以參數的形式在命令行上指定輸入文件的文件名,所以輸入重定向并不經常使用。盡管如此,當要使用一個不接受文件名作為輸入參數的命令,而需要的輸入內容又存在一個文件里時,就能用輸入重定向解決問題。 1. 輸出重定向 輸出重定向是指把命令(或可執行程序)的標準輸出或標準錯誤輸出重新定向到指定文件中。這樣,該命令的輸出就不顯示在屏幕上,而是寫入到指定文件中。 輸出重定向比輸入重定向更常用,很多情況下都可以使用這種功能。例如
29、,如果某個命令的輸出很多,在屏幕上不能完全顯示,那么將輸出重定向到一個文件中,然后再用文本編輯器打開這個文件,就可以查看輸出信息;如果想保存一個命令的輸出,也可以使用這種方法。還有,輸出重定向可以用于把一個命令的輸出當作另一個命令的輸入(還有一種更簡單的方法,就是使用管道,將在下面介紹)。 輸出重定向的一般形式為:命令>文件名。例如: $ ls > directory.out $ cat directory.out ch1.doc ch2.doc ch3.doc chimp config mail/ test/ $ 將ls命令的輸出保存為一個名為directory.
30、out的文件。 注:如果>符號后邊的文件已存在,那么這個文件將被重寫。 為避免輸出重定向中指定文件只能存放當前命令的輸出重定向的內容,shell提供了輸出重定向的一種追加手段。輸出追加重定向與輸出重定向的功能非常相似,區別僅在于輸出追加重定向的功能是把命令(或可執行程序)的輸出結果追加到指定文件的最后,而該文件原有內容不被破壞。 如果要將一條命令的輸出結果追加到指定文件的后面,可以使用追加重定向操作符>>。形式為:命令>>文件名。例如: $ ls *.doc>>directory.out $ ca
31、t directory.out ch1.doc ch2.doc ch3.doc chimp config mail/ test/ ch1.doc ch2.doc ch3.doc $ 和程序的標準輸出重定向一樣,程序的錯誤輸出也可以重新定向。使用符號2>(或追加符號2>>)表示對錯誤輸出設備重定向。例如下面的命令: $ ls /usr/tmp 2> err.file 可在屏幕上看到程序的正常輸出結果,但又將程序的任何錯誤信息送到文件err.file中,以備將來檢查用。 還可以使用另一個輸出重定向操作符(&>)將
32、標準輸出和錯誤輸出同時送到同一文件中。例如: $ ls /usr/tmp &> output.file 利用重定向將命令組合在一起,可實現系統單個命令不能提供的新功能。例如使用下面的命令序列: $ ls /usr/bin > /tmp/dir $ wc w < /tmp/dir 459 統計了/usr/bin目錄下的文件個數。 管 道 將一個程序或命令的輸出作為另一個程序或命令的輸入,有兩種方法,一種是通過一個臨時文件將兩個命令或程序結合在一起,例如上個例子中的/tmp/dir文件將ls和wc命令聯在一起;另一種是Linux所提供的管道
33、功能。這種方法比前一種方法更好。 管道可以把一系列命令連接起來,這意味著第一個命令的輸出會作為第二個命令的輸入通過管道傳給第二個命令,第二個命令的輸出又會作為第三個命令的輸入,以此類推。顯示在屏幕上的是管道行中最后一個命令的輸出(如果命令行中未使用輸出重定向)。 通過使用管道符“|”來建立一個管道行。用管道重寫上面的例子: $ ls /usr/bin|wc -w 1789 再如: $ cat sample.txt|grep "High"|wc -l 管道將cat命令(列出一個文件的內容)的輸出送給grep命令。grep命令在輸入里查找單詞High,grep命令的輸出則是所有
34、包含單詞High的行,這個輸出又被送給wc命令,wc命令統計出輸入中的行數。假設sample.txt文件的內容如下: Things to do today: Low:Go grocery shopping High:Return movie High:Clear level 3 in Alien vs. Predator Medium:Pick up clothes from dry cleaner 那么該管道行的結果是2。 命令替換 命令替換和重定向有些相似,但區別在于命令替換是將一個命令的輸出作為另外一個命令的參數。常用命令格式為: command1 command2 其中,command
35、2的輸出將作為command1的參數。需要注意的是這里的符號,被它括起來的內容將作為命令執行,執行后的結果作為command1的參數。例如: $ cd pwd 該命令將pwd命令列出的目錄作為cd命令的參數,結果仍然是停留在當前目錄下C shell 命令描述C shell 提供以下內置命令:alias Name WordList 如果不指定任何參數,則顯示所有別名。否則,命令顯示所指定 Name 的別名。如果指定 WordList,則此命令將 WordList 的值指定給別名 Name。指定的別名 Name 不能是 alias 或 unal
36、ias。bg %Job . 將當前作業或 Job 指定的作業置于后臺,如果它停止則繼續此作業。break 在最近圈起的 foreach 或 while 命令的 end 后,繼續運行。breaksw 從 switch 命令中斷;在 endsw 命令后繼續。case Label: 在 switch 命令中定義 Label。cdName
37、; 等價于 chdir 命令(請參閱以下描述)。chdir Name 家當前目錄更改到 Name 變量指定的那個目錄。如果不指定 Name,則命令更改為您的主目錄。如果 Name 變量的值不是當前目錄的子目錄,并且不以 /、./、或 ./ 開始,則 shell 檢查 cdpath shell 變量的每個組件以查看它是否具有匹配 Name 變量的子目錄。如果 Name 變量是含以 / 開始的值的 shell 變量,則 shell 嘗試此操作以查看它是否是目錄。chdir 命令等價于 cd 命令。continue
38、160; 在最近圈起的 while 或 foreach 命令的 end 處,繼續運行。default: 標注 switch 語句中的 default 情況。default 應在所有其它 case 標號后出現。dirs 顯示目錄堆棧。echo 將字符串寫入 shell 的標準輸出。else 運行 if (Expression) then .else if (Expres
39、sion2) then . else . endif 命令序列中第二個 else 后的命令。end 繼續將 Name 變量設置為由 List 變量指定的每個成員,并運行 foreach 與匹配的 end 語句之間的 Commands 序列。foreach 和 end 語句必須單獨出現在獨立的行上。 使用 continue 語句繼續循環,使用 break 語句提前結束循環。當 foreach 命令從終端讀取時,C shell 使用 ? 提示以允許輸入 Commands。循環中的命令(由 ? 提示)不放入歷史列表。endif
40、60; 如果 Expression 變量為真,則運行跟隨第一個 then 語句的 Commands。如果 else if Expression2 為真,則運行跟隨第二個 then 語句的 Commands。如果 else if Expression2 為假,則運行跟隨 else 的 Commands。任何 else if 的對數都是可能的。只需要一個 endif 語句。else 段是可選的。字 else 和 endif 只能在輸入行的開始使用。if 段必須單獨出現在其輸入行上或在 else 命令后。endsw 繼
41、續將每個 case 標號與 string 變量的值匹配。string 是首先展開的命令和文件名。在 case 標號中使用模式匹配字符 *、? 和 . . . ,它們是變量擴展的。如果在 default 標號前沒有找到標號匹配,則執行在 default 標記后開始。case 標號和 default 標號必須出現在行的開始。breaksw 命令導致執行在 endsw 命令后繼續。否則,控制可能對 case 和 default 標號無效,如在 C 編程語言中一樣。如果沒有標號匹配,并且沒有 default,則在 endsw 命令后執行繼續。eval Parameter . . .
42、160; 在輸入至 shell 時讀 Parameter 變量的值,并在當前 shell 的上下文中運行結果命令。使用此命令以運行作為命令或變量替換的結果生成的命令,因為語法分析在這些替換前發生。C shell學習筆記(一)綜合1 #!/bin/csh2 可用set與env命令查看環境變量與當前值3 、set xxx=xxx 設置局部數值變量/變量;setenv 設置全局變量 eg.set name 賦空值set name = (John Doe)setenv name “John Doe”4 命令替換 eg.set command = pwdecho
43、 “The is : $command”顯示:The is : /5 所有UNIX命令在執行成功時傳回一個退出狀態0,在失敗時傳回非0。一個命令傳回的狀態值被保存在只讀環境變量$?中,可以由調用進程檢查。6 從標準輸入讀 set xxx=$<或者set xxx=head leg.#!/bin/cshecho n “Enter input:”set line=head lecho “You entered: $line”exit 07 unset xxx unsetenv xxx8 向腳本傳遞參數 eg:#!/bin/cshecho “The comma
44、nd name is : $0”echo “The number of command line arguments are $#argv”echo n “The value of the command line arguments are:”echo “$argv1 $argv2 ”echo “Another way to display value of all of the arguments : $argv*”exit 09-1if () thenelse if () thenelse if () thenelseendif9-2foreach variable (argument
45、list)command listend9-3while (expression)(真時)end(假時)9-4switch (“$string”)case “yangfeng”:breakswcase “panye”:breakswdefault:breakswendsw10 數值變量eg. a=10 b=15 difference = ( $a - $b ) sum = ( $a + $b ) a+ a+=1 area = $a*$b11 數組set xxx = ()$#xxx元素個數$?xxx是否初始化(返回1表示已初始化)$xxx$xxxi用set命令對任何shell變量賦以多個值,將會
46、使其成為一個數組12 連接多個字符串eg.set thisfile=”$directory”/”$file$index”C Shell Programming IntroductionShell:命令行解釋器,在Unix系統中一般用來做為調用其他程序的媒介。Commands: 命令,一般由命令名+參數構成。輸出到文件:命令一般地從終端接受輸入和輸出結果,使用重定向符>可以將輸出寫入文件。例如data > now,將輸出寫入now中。從文件輸入:使用<可以從文件讀入作為命令的輸入。例如 sort < data 將data文件內容排序。通配符:*能匹配任何字符串; ?能匹配
47、一個任意字符; a.b將匹配 中的任意一個字符;a-b將匹配從a到b之間的任意一個字符。(注意:上面的通配符不能匹配'.'及'!')表示當前用戶的主目錄。轉義字符:將使其后的字符成為普通字符。chsh命令:改變使用的shell類型終止當前執行任務: C:中斷信號; D:End of file信號; Z:將當前任務掛起, fg可繼續執行掛起的命令。!$ 表示上一條命令的最后一個參數! 重復執行上一條指令!c 重復執行上一條以c開頭的指令alias 起別名,可以給一個經常使用的很長的命令起一個別名,以免重復輸入很長的命令??梢约拥絪hell的啟動配置文件中.bash
48、rc/.mand >& file 將診斷輸出和標準輸出到文件filecommand >> file 將輸出追加到已存在的file尾部如果在命令的最后加上&號則將在后臺運行該命令在后臺執行的任務不會受到鍵盤上任意輸入信號如C等的影響??梢允褂胹top % num命令掛起當前在后臺運行的程序。num為要終止的后臺程序的編號??梢允褂肸掛起當前前臺運行程序然后使用bg命令恢復并改為后臺執行。Shell控制結構與Shell腳本1、變量替換$?name:當name有值時該表達式的值為1,否則為0$#name: 值為name中的元素個數$n:n為一個整數
49、表示$argvn,argv的第n個參數。區別:使用$argvn時如果n的值越界會產生錯誤,而$n不會。$*:表示$argv$:表示當前shell的進程號$<:會被shell標準輸入中輸入的下一行取代(不是從腳本文件中)2、表達式在shell腳本中C語言中所有的算術運算都可以使用,如=,!=等。另外還有=,!跟=與!=意義類似,不過=、!右邊的表達式可以有通配符,檢測左邊的字符串是否是右邊字符串的模式。-?filename: 文件查詢。例如-e filename意思是filename是否存在。使用把command括起來可以知道該command是否正常執行結束(返回1或者0)3、控制結構if
50、(expression)then command .endif注意,以下兩種表示是無效的if(expression)then command .endif及if(expression)then command endif另外,if(expression)command也可以寫成if(expression) commandcommand不能包含'|','&',''
51、;,也不能是其他的控制語句。:修飾符用來從一個文件名中分出文件名主體和擴展名。例如,假設i的值為/mnt/foo.bar,那么% echo $i $i:r $i:e/mnt/foo.bar /mnt/foo bar#號為注釋符其他的控制結構:while(expression) commandsendswitch(word)case str1: commands breaksw.case strn: commands
52、breakswdefault: commands breakswendswloop: commands goto loopshell學習1chmod命令 改變文件權限 chmod mode fileu:文件屬主 g:同組成員 o:其他成員 a:所有用戶4:可讀 2:可寫
53、0; 1:可執行d:目錄 l:符號鏈接 s:套接字文件 b:塊設備文件 c:字符設備文件 p:命名管道文件 -:普通文件suid和guid某個用戶對屬于自己的shell腳本設置了這種權限,那么其他用戶在執行這一腳本時也會具有其屬主的相應權限。設置suid,在原有權限位前面加上一個4,如chmod 4755 file。設置guid,在原有權限位前面加上一個2,如chmod 2755 file。chown和chgrp改變文件所屬的用戶
54、; chmod owner fileumask設定文件創建時的缺省模式。對于文件,權限位最大為6。對于目錄,權限位最大為7。umask值+當前權限值=最大權限位ln命令ln -s source_path target_pathfind命令-name 根據名字查找-perm 根據權限查找-mtime 根據日期查找(-5:5天以內 +10:10天以前)-prune 忽略某個目錄-newer 比某個文件更新(-newer file1 ! -newer file2 日期在file1和file2之間)-exec或ok 找到后執行命令(find . -typ
55、e f -exec ls -l ;)xargs:通過管道獲取find到的文件,執行命令。find . -name "*.log" | xargs rm find . -name "*.c" | xargs grep "main"shell學習2cron系統調度進程,在無人工干預的情況下執行任務。crontab文件格式:分 時 日 月 星期 需執行的命令每個域可以用","和"-"號來表示多個值,如1-5或1,2,4。crontab命令格式:crontab -u user -l
56、-e -r file -l:列出當前job-e:編輯當前crontab文件-r:刪除當前crontab文件如何提交一個crontab文件?1. 在當前用戶$HOME目錄下的.profile文件中,加入:EDITOR=vi; export=EDITOR2. 新建一個<user>cron,如tlhcron,加入如以下內容:0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console3. 用crontab tlhcron提交給cron守護進程。at命令向cron守護進程提交任務,保留當前所有環境變
57、量。基本格式:at -f script -l -m -r time date-m:完成后給用戶發郵件直接用at+時間,可進入命令行模式,提交多個任務,按CTRL+D結束。& 讓命令運行在后臺nohup 讓命令在用戶退出后仍運行. 匹配中的任一字符!. 匹配中非!之后的字符echo - Linux下需要使用-n選項使輸出不換行- 選項-e使轉義字符生效- 用字符''實現轉義。如 echo " "hello world!"&quo
58、t;readread var1 var2如read name surname鍵入:leehom tan查看:echo $name和echo $surname,分別為leehom和tan。catcat file1 file2 > file管道|命令1 | 命令2命令1的輸出是命令2的輸入。tee將輸出分為兩支,一支輸出給標準輸出,另外一支拷貝給相應的文件。如: make | tee make.log-a 選項追加至文件。重定向標準輸入:0 標準輸出:1 標準錯誤:2comm
59、and > filename 2>&1 把標準輸出和標準錯誤一起重定向到一個文件中command < filename >filename2 把command命令以filename1文件作為標準輸入,以filename2文件作為標準輸出command <&m 把文件描述符m作為標準輸入command >&m 把標準輸出重定向到文件描述符m中command <&- 關閉標準輸入exec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 本田rt考試題及答案
- 吧臺咖啡考試題及答案
- 服務公司銷售管理制度
- 幼兒園校園用具管理制度
- 國土資源規范化管理制度
- 江蘇測繪公司管理制度
- 事業編請假制度管理制度
- 中國合伙人公司管理制度
- 子公司業務授權管理制度
- 初高中教育機構管理制度
- 2025屆高三語文二輪復習:典型題各個擊破之表達效果類語用題型(含答案解析)
- 2025年四級聽力試題及原文答案
- 數字媒體制作技術規范及操作指南
- 不要慌太陽下山有月光二部合唱線譜
- 南京科遠KD200變頻器使用手冊
- 仁愛版九上英語單詞表
- 中國糖尿病防治指南(2024版)解讀
- 《三國演義》探究課 課件
- 河道鋼板樁圍堰施工方案
- 江蘇省南通市金沙街道公開招錄村(社區)后備干部高頻重點提升(共500題)附帶答案詳解
- 臨床路徑品管圈
評論
0/150
提交評論