歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Linux 的shell基礎教學

Linux 的shell基礎教學

日期:2017/2/27 14:23:07   编辑:SHELL編程
  Linux的shell好比DOS的COMMAND.COM,在用戶和系統之間架起一座橋梁,讓用戶方便地操作系統。由於Linux是一個完全開放的平台,有許多人都為它編寫了Shell程序。其中的BASH(Baurne Again SHell)容納了其他Shell程序的許多特征,功能十分全面,所以我們以它為例來講解Shell的一些用法。   在開始講解Linux的一些用法之前,我們將先介紹一些命令,以便讀者在以後的文中做參考。   1.ls命令   格式:ls [選項] [文件列表]   選項:無,顯示當前目錄的文件,類似DOS下的dir/w命令;   -l,顯示文件的詳細內容,有文件類型、文件權限、鏈接或目錄計數、所有者、所有組、文件大小、文件日期和文件名。   -R,從指定目錄開始列出所有向下的目錄中的文件,類似DOS下的dir/s命令。   2.who命令   格式:who   選項:無,顯示當前都有哪些用戶在使用Linux。   3.cat命令   格式:cat [文件列表]   作用:顯示文件列表中文件的內容。   4.passwd命令   格式:passwd   作用:設定用戶口令。   5.pwd命令   格式:pwd   作用:顯示當前路徑。類似DOS下無參數的cd命令。   6.cd命令   格式:cd [路徑名]   作用:改變當前路徑,同DOS下的cd命令。   7.rm命令   格式:rm [文件列表]   作用:刪除文件列表中的文件。同DOS下的del命令。   8.wc命令   格式:wc [選項] [文件名]   選項:無,顯示文件的行數、詞數、字符數。   -w,只顯示文件的詞數。   下面我們將開始講述Linux Shell的一些用法。   一、命令行編輯   在Linux下,當我們輸入一行命令但沒有按Enter鍵時發現輸入有誤,我們應該怎麼辦?Linux為我們提供了兩個特殊符號@和#。   @號的作用是將整行廢除。例如:   $wwho @   who   root tty1 Dec 3 10:22   cl tty2 Dec 3 11:57   cXP tty3 Dec 3 13:54   在這個例子中,命令的頭一個字符有誤,用@廢除這一行,然後重新輸入who命令。   #號的作用是將前一個字符廢除。例如:   $ww#hho##o   root tty1 Dec 3 10:22   cl tty2 Dec 3 11:57   cxp tty3 Dec 3 13:54   在這個例子中,第一個#用於廢除多寫的那個w,第二個#把o刪除,第三個#把多寫h的刪除,再補上o,就是who命令。   這樣看來Linux的操作十分麻煩,其實這兩項功能多用於那些老的鍵盤上。在現在的鍵盤上自然要方便的多了。你可以通過左右鍵、Del鍵、退格鍵來編輯命令行,就像在文本文件中編輯一行文本一樣輕松,這可比DOS還要方便。   二、命令補全   當用戶輸入一個命令的一部分後,按Tab鍵,Shell將試圖補全這個命令。例如:   $pass< Tab>   Bash知道這是一個命令,並查找以pass開頭的命令,當查到只有passwd符合條件時,Bash將把命令補全。如果查找到多個以輸入字符串開頭的命令,則會發出警告聲,在按一下Tab鍵,將顯示出以此字符串開頭的命令。例如:   $pas< Tab>< Tab>   passwd paste   此時在原輸入字符串的基礎上增加字符避免多義性後,再用Tab鍵即可補全命令。   Bash不僅能補全命令,還能補全做命令參數的文件名,如:   $ls -l /home/public/c< Tab>< Tab>   clfile cxpfile   $ls -l /home/public/cl< Tab>   -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile   在這個例子中,按第一個Tab鍵,會有警告聲,第二個Tab鍵用於顯示在/home/public目錄下同以c開頭的文件的名稱,然後添加字符l,在按Tab鍵,Bash將補全文件名,即clfile。   三、歷史表(history list)   因為用戶很有可能用到過去用過的命令,所以Bash將每次輸入的命令都記錄在歷史表中以便將來使用。歷史表可以容納下500條命令。這麼大的容量足夠我們使用的了。在退出登錄時,Bash將歷史表的內容保存到.bash_history文件中,在登錄時,又將.bash_history的內容寫入歷史表中,這樣一來就好像接著上一次登錄一樣,我們可以使用history命令來顯示歷史表中的記錄。例如:   $history   210 who   211 passwd   212 cd public   213 cp /home/file/clfile .   214 cp /home/file/cxpfile .   215 ls -l /home/pubic   從例子中可以看出,每一個命令占一行,被稱為一個事件(event),每一個事件的前一部分的數字被稱為事件號,後一部分則是命令。   如果我們想要執行歷史表中的命令,我們可以用歷史代替操作符(!)加上事件號來實現。例如:   $!210   who   root tty1 Dec 3 10:22   cl tty2 Dec 3 11:57   cxp tty3 Dec 3 13:54   在例子中,我們執行了歷史表中事件號為210的who命令。   如果想要執行最近一次的命令,可以如下輸入:   $!!   who   root tty1 Dec 3 10:22   cl tty2 Dec 3 11:57   cxp tty3 Dec 3 13:54   我們也可以用!和命令連用,來重復過去執行過的命令。這樣的優點是不必寫出命令的參數。如:   $!ls   ls -l /home/pubic   -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile   -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile   還有一種方法是在命令的任何位置查找與指定輸入部分相同的命令。具體做法是用一對?把要查找的字符串括起來,例如:   $!?-l?   ls -l /home/pubic   -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile   -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile   在這條命令中,Bash在每個事件中搜索有無-l這個字符串,當搜索到有-l字符串的ls -l /home/pubic命令時,就執行它。   如果第二個問號後面再沒有其他的東西,則可省略第二個問號,因此上面的例子也可以寫成:   $!?-l   如果要重復命令,但又要做些改動,可以用s/old/new來實現,它的作用是將old部分的字符串換成new部分的字符串。例如:   $!?-l?:s/public/cl   ls -l /home/cl   drwxrw-r-- 1 cl user 1067 Apr 19 23:35mp   -rw-r--r-- 2 cl user 21 Dec 3 13:41clfile   這個例子是將ls -l /home/public命令中的public換成cl,然後執行。即執行ls -l /home/cl。   其實,上面這些命令還有一個很簡單的實現方法,即按向上鍵,在提示符後就會出現前一次的命令。因此,我們可以通過按上鍵在歷史表中從尾部向前查找命令。當找到要執行的命令後,可以直接按Enter鍵執行,也可以用前面介紹的命令行編輯方法修改命令。而向下鍵的作用正好與向上鍵相反,是從前向後查找歷史表。大家可以在實際運用中體會它們的用法。   四、路徑名擴展   我想大家對DOS中的*和?不陌生吧。在Linux下它們的用途完全相同。   *代表任意一個字符串,例如:   $ls -l /home/public/c*   -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile   -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile   在這個例子中,Bash將*擴展後使c*變為clfile、cxpfile。   ?代表任意一個字符,例如:   $cat /home/public/c?file   User name is CaoLei.   在這條命令中,Bash將?擴展後得到clfile,即執行cat /home/public/clfile命令。   同DOS一樣,Linux允許在一行中重復使用*和?,如:   $ls c*f*   clfile cxpfile   $ls c?pf?le   cxpfile   在Linux中,比DOS還多一種路徑名擴展方式,即用[]把要匹配的字符括起來,如:   $rm dirfle[12346789]   這行命令的作用是刪除名為dirfile1、dirfile2、…、dirfile4、dirfile6、…、dirfile9的這些文件。我們也可以用一種 比較簡單的寫法來表示上面的命令:   $rm dirfile[1-46-9]   不僅可以用數字,還可以使用字母:   $rm dirfile[abcdefghijklmnopqrstuvwxyz]   $rm dirfile[a-z]   這兩條命令是同一個意思,它們都是把名為dirfilea、…、dirfilez的這些文件刪除。   五、輸入/輸出重新定向   Linux命令一般從標准輸出設備獲得信息,經過命令程序處理後,再將結果送到標准輸出設備上。鍵盤既是Linux的標准輸出設備,顯示器既是Linux的標准輸入設備。   有時,要從文件中獲得信息,或是將結果送到文件中。因為每個命令不一定都帶有相應的參數,所以Bash提供了將命令的標准輸出和標准輸入重新定向的功能,這些功能可以通過相應的符號表示。   1.>和>>   >的功能是將命令的輸出送入文件中。如果文件不存在,則創建這個文件;如果文件存在,則覆蓋這個文件,如:   $ls -l > dirfile   $cat dirfile   -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile   -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile   這個例子中,第一個命令前半部分是列出一個目錄的文件清單,在一般情況下文件清單顯示到屏幕上。但後半部分有>號,Bash將標准輸出定義為名為dirfilr的文件,將顯示結果保存到了這個文件中。第二個命令用於察看dirfile文件的內容,它的內容和直接使用ls -l的結果一樣。   >>的功能同>相似,不同的是:如果文件存在,它並不是覆蓋文件,而是將結果添加的文件的後面。例如:   $ls -l >> dirfile   $cat dirfile   -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile   -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile   -rw-r--r-- 2 cl user 21 Dec




Copyright © Linux教程網 All Rights Reserved