?? linux_shell
字號:
weight=1# one arg must be given:[ -z "$1" ] && helpbinnum="$1"binnumorig="$1"while [ -n "$binnum" ]; do lastchar "$binnum" if [ "$rval" = "1" ]; then sum=`expr "$weight" "+" "$sum"` fi # remove the last position in $binnum chop "$binnum" binnum="$rval" weight=`expr "$weight" "*" 2`doneecho "binary $binnumorig is decimal $sum" 該腳本使用的算法是利用十進制和二進制數權值 (1,2,4,8,16,..),比如二進制"10"可以這樣轉換成十進制:0 * 1 + 1 * 2 = 2 為了得到單個的二進制數我們是用了lastchar 函數。該函數使用wc –c計算字符個數,然后使用cut命令取出末尾一個字符。Chop函數的功能則是移除最后一個字符。 文件循環程序 或許您是想將所有發出的郵件保存到一個文件中的人們中的一員,但是在過了幾個月以后,這個文件可能會變得很大以至于使對該文件的訪問速度變慢。下面的 腳本rotatefile可以解決這個問題。這個腳本可以重命名郵件保存文件(假設為outmail)為outmail.1,而對于outmail.1就變成了outmail.2 等等等等...#!/bin/sh# vim: set sw=4 ts=4 et:ver="0.1"help(){ cat <rotatefile -- rotate the file nameUSAGE: rotatefile [-h] filenameOPTIONS: -h help textEXAMPLE: rotatefile outThis will e.g rename out.2 to out.3, out.1 to out.2, out to out.1and create an empty out-fileThe max number is 10version $verHELP exit 0}error(){ echo "$1" exit 1}while [ -n "$1" ]; docase $1 in -h) help;shift 1;; --) break;; -*) echo "error: no such option $1. -h for help";exit 1;; *) break;;esacdone# input check:if [ -z "$1" ] ; thenerror "ERROR: you must specify a file, use -h for help"fifilen="$1"# rename any .1 , .2 etc file:for n in 9 8 7 6 5 4 3 2 1; do if [ -f "$filen.$n" ]; then p=`expr $n + 1` echo "mv $filen.$n $filen.$p" mv $filen.$n $filen.$p fidone# rename the original file:if [ -f "$filen" ]; then echo "mv $filen $filen.1" mv $filen $filen.1fiecho touch $filentouch $filen 這個腳本是如何工作的呢?在檢測用戶提供了一個文件名以后,我們進行一個9到1的循環。文件9被命名為10,文件8重命名為9等等。循環完成之后,我們將原始文件命名為文件1同時建立一個與原始文件同名的空文件。調試 最簡單的調試命令當然是使用echo命令。您可以使用echo在任何懷疑出錯的地方打印任何變量值。這也是絕大多數的shell程序員要花費80%的時間來調試程序的原因。Shell程序的好處在于不需要重新編譯,插入一個echo命令也不需要多少時間。 shell也有一個真實的調試模式。如果在腳本"strangescript" 中有錯誤,您可以這樣來進行調試:sh -x strangescript 這將執行該腳本并顯示所有變量的值。 shell還有一個不需要執行腳本只是檢查語法的模式。可以這樣使用:sh -n your_script ==========================================================================================================================================Linux主要shell命令詳解作者:北南南北 2005-02-03 15:43:30 來自:Linux先生 shell是用戶和Linux操作系統之間的接口。Linux中有多種shell,其中缺省使用的是Bash。本章講述了shell的工作原理,shell的種類,shell的一般操作及Bash的特性。 什么是shellLinux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的接口。它是命令語言、命令解釋程序及程序設計語言的統稱。shell是用戶和Linux內核之間的接口程序,如果把Linux內核想象成一個球體的中心,shell就是圍繞內核的外層。當從shell或其他程序向Linux傳遞命令時,內核會做出相應的反應。shell是一個命令語言解釋器,它擁有自己內建的shell命令集,shell也能被系統中其他應用程序所調用。用戶在提示符下輸入的命令都由shell先解釋然后傳給Linux核心。有一些命令,比如改變工作目錄命令cd,是包含在shell內部的。還有一些命令,例如拷貝命令cp和移動命令rm,是存在于文件系統中某個目錄下的單獨的程序。對用戶而言,不必關心一個命令是建立在shell內部還是一個單獨的程序。shell 首先檢查命令是否是內部命令,若不是再檢查是否是一個應用程序(這里的應用程序可以是Linux本身的實用程序,如ls和rm,也可以是購買的商業程序,如xv,或者是自由軟件,如emacs)。然后shell在搜索路徑里尋找這些應用程序(搜索路徑就是一個能找到可執行程序的目錄列表)。如果鍵入的命令不是一個內部命令并且在路徑里沒有找到這個可執行文件,將會顯示一條錯誤信息。如果能夠成功找到命令,該內部命令或應用程序將被分解為系統調用并傳給 Linux內核。 shell的另一個重要特性是它自身就是一個解釋型的程序設計語言,shell程序設計語言支持絕大多數在高級語言中能見到的程序元素,如函數、變量、數組和程序控制結構。shell編程語言簡單易學,任何在提示符中能鍵入的命令都能放到一個可執行的shell程序中。當普通用戶成功登錄,系統將執行一個稱為shell的程序。正是shell進程提供了命令行提示符。作為默認值(TurboLinux系統默認的shell是BASH),對普通用戶用“$”作提示符,對超級用戶(root)用“#”作提示符。一旦出現了shell提示符,就可以鍵入命令名稱及命令所需要的參數。shell將執行這些命令。如果一條命令花費了很長的時間來運行,或者在屏幕上產生了大量的輸出,可以從鍵盤上按ctrl+c發出中斷信號來中斷它(在正常結束之前,中止它的執行)。當用戶準備結束登錄對話進程時,可以鍵入logout命令、exit命令或文件結束符(EOF)(按ctrl+d實現),結束登錄。我們來實習一下shell是如何工作的。$ make workmake:***No rule to make target ‘work’. Stop.$注釋:make是系統中一個命令的名字,后面跟著命令參數。在接收到這個命令后,shell便執行它。本例中,由于輸入的命令參數不正確,系統返回信息后停止該命令的執行。在例子中,shell會尋找名為make的程序,并以work為參數執行它。make是一個經常被用來編譯大程序的程序,它以參數作為目標來進行編譯。在 “make work”中,make編譯的目標是work。因為make找不到以work為名字的目標,它便給出錯誤信息表示運行失敗,用戶又回到系統提示符下。另外,用戶鍵入有關命令行后,如果shell找不到以其中的命令名為名字的程序,就會給出錯誤信息。例如,如果用戶鍵入:$ myprogbash: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是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包括命令行編輯、可編程單詞補全、拼寫校正、歷史命令替換、作業控制和類似C語言的語法,它不僅和Bash shell是提示符兼容,而且還提供比Bash shell更多的提示符參數。Korn shell集合了C shell和Bourne shell的優點并且和Bourne shell完全兼容。Linux系統提供了pdksh(ksh的擴展),它支持任務控制,可以在命令行上掛起、后臺執行、喚醒或終止程序。Linux 并沒有冷落其他shell用戶,還包括了一些流行的shell如ash、zsh等。每個shell都有它的用途,有些shell是有專利的,有些能從 Internet網上或其他來源獲得。要決定使用哪個shell,只需讀一下各種shell的聯機幫助,并試用一下。用戶在登錄到Linux時由/etc/passwd文件來決定要使用哪個shell。例如:# fgrep lisa /etc/passwdlisa:x:500:500:TurboLinux User:/home/lisa:/bin/bashshell被列每行的末尾(/bin/bash)。由于Bash是Linux上缺省的shell,本章主要介紹Bash及其相關知識。shell命令命令行c用戶登錄到Linux系統時,可以看到一個shell提示符,標識了命令行的開始。用戶可以在提示符后面輸入任何命令及參數。例如:$ date二 11 23 01:34:58 CST 1999$用戶登錄時,實際進入了shell,它遵循一定的語法將輸入的命令加以解釋并傳給系統。命令行中輸入的第一個字必須是一個命令的名字,第二個字是命令的選項或參數,命令行中的每個字必須由空格或TAB隔開,格式如下:$ Command Option Arguments1. 選項和參數選項是包括一個或多個字母的代碼,它前面有一個減號(減號是必要的,Linux用它來區別選項和參數),選項可用于改變命令執行的動作的類型。例如:$ lsmotd passwd$這是沒有選項的ls命令,可列出當前目錄中所有文件,只列出各個文件的名字,而不顯示其他更多的信息。$ ls -ltotal 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目錄下的所有文件及其信息。有些命令,如ls可以帶參數,而有一些命令可能需要一些最小數目的參數。例如,cp命令至少需要兩個參數,如果參數的數目與命令要求不符,shell將會給出出錯信息。例如:$ cp -i mydata newdata注意:命令行中選項先于參數輸入。2. 命令行特征命令行實際上是可以編輯的一個文本緩沖區,在按回車之前,可以對輸入的文本進行編輯。比如利用BACKSPACE鍵可以刪除剛鍵入的字符,可以進行整行刪除,還可以插入字符,使得用戶在輸入命令,尤其是復雜命令時,若出現鍵入錯誤,無須重新輸入整個命令,只要利用編輯操作,即可改正錯誤。利用上箭頭可以重新顯示剛執行的命令,利用這一功能可以重復執行以前執行過的命令,而無須重新鍵入該命令。bash 保存著以前鍵入過的命令的列表,這一列表被稱為命令歷史表。按動上箭頭,便可以在命令行上逐次顯示各條命令。同樣,按動下箭頭可以在命令列表中向下移動,這樣可以將以前的各條命令顯示在命令行上,用戶可以修改并執行這些命令。這一特征將在10.4節中進行詳細的論述。在一個命令行中還可以置入多個命令,用分號將各個命令隔開。例如:$ ls -F;cp -i mydata newdata也可以在幾個命令行中輸入一個命令,用反斜杠將一個命令行持續到下一行。$ cp –imydatanewdata 上面的cp命令是在三行中輸入的,開始的兩行以反斜杠結束,把三行作為一個命令行。shell中的特殊字符shell中除使用普通字符外,還可以使用一些具有特殊含義和功能的特殊字符。在使用它們時應注意其特殊的含義和作用范圍。下面分別對這些特殊字符加以介紹。1. 通配符通配符用于模式匹配,如文件名匹配、路經名搜索、字符串查找等。常用的通配符有*、?和括在方括號[ ]中的字符序列。用戶可以在作為命令參數的文件名中包含這些通配符,構成一個所謂的“模式串”,在執行過程中進行模式匹配。* 代表任何字符串(長度可以不等),例如:“f*”匹配以f打頭的任意字符串。但應注意,文件名前的圓點(.)和路經名中的斜線(/)必須顯式匹配。例如“*”不能匹配.file,而“.*”才可以匹配.file。? 代表任何單個字符。[]代表指定的一個字符范圍,只要文件名中[]位置處的字符在[]中指定的范圍之內,那么這個文件名就與這個模式串匹配。方括號中的字符范圍可以由直接給出的字符組成,也可以由表示限定范圍的起始字符、終止字符及中間的連字符(-)組成。例如,f [a- d] 與f [abcd]的作用相同。Shell將把與命令行中指定的模式串相匹配的所有文件名都作為命令的參數,形成最終的命令,然后再執行這個命令。下面我們給出表10-1說明這些通配符的具體含義。表10-1 通配符含義舉例模式串意 義*當前目錄下所有文件的名稱。*Text*當前目錄下所有文件名中包含有Text的文件的名稱。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -