shell腳本手冊
⑴ 什麼是shell腳本
什麼是shell
shell是用戶和linux操作系統之間的介面。Linux中有多種shell,其中預設使用的是Bash。本章講述了shell的工作原理,shell的種類,shell的一般操作及Bash的特性。
什麼是shell
Linux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的介面。它是命令語言、命令解釋程序及程序設計語言的統稱。
shell是用戶和Linux內核之間的介面程序,如果把Linux內核想像成一個球體的中心,shell就是圍繞內核的外層。當從shell或其他程序向Linux傳遞命令時,內核會做出相應的反應。
shell是一個命令語言解釋器,它擁有自己內建的shell命令集,shell也能被系統中其他應用程序所調用。用戶在提示符下輸入的命令都由shell先解釋然後傳給Linux核心。
Shell是一種具備特殊功能的程序, 它是介於使用者和 UNIX/linux 操作系統之核心
程序(kernel)間的一個介面。為什麼我們說 shell 是一種介於系統核心程序與使用者
間的中介者呢?讀過操作系統概論的讀者們都知道操作系統是一個系統資源的管理者與分
配者,當您有需求時,您得向系統提出;從操作系統的角度來看,它也必須防止使用者因
為錯誤的操作而造成系統的傷害?眾所周知,對計算機下命令得透過命令(command) 或
是程序(program);程序有編譯器(compiler)將程序轉為二進制代碼,可是命令呢?
其實shell 也是一支程序,它由輸入設備讀取命令,再將其轉為計算機可以了解的機械碼,
然後執行它。
各種操作系統都有它自己的 shell,以 DOS 為例,它的 shell 就是 command.com文
件。如同 DOS 下有 NDOS,4DOS,DRDOS 等不同的命令解譯程序可以取代標準的
command.com ,UNIX 下除了 Bourne shell(/bin/sh) 外還有 C shell(/bin/csh)、
Korn shell(/bin/ksh)、Bourne again shell(/bin/bash)、Tenex C shell(tcsh)
等其它的 shell。UNIX/linux將 shell 獨立於核心程序之外, 使得它就如同一般的應用
程序, 可以在不影響操作系統本身的情況下進行修改、更新版本或是添加新的功能。
有一些命令,比如改變工作目錄命令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腳本快速學習指南的目錄
序.
前言
第1章 背景知識
1.1 unix簡史
1.2 軟體工具的原則
1.3 小結
第2章 入門
2.1 腳本編程語言與編譯型語言的差異
2.2 為什麼要使用shell腳本
2.3 一個簡單的腳本
2.4 自給自足的腳本:位於第一行的#!
2.5 shell的基本元素
2.6 訪問shell腳本的參數
2.7 簡單的執行跟蹤
2.8 國際化與本地化
2.9 小結
第3章 查找與替換
3.1 查找文本
3.2 正則表達式
3.3 欄位處理
.3.4 小結
第4章 文本處理工具
4.1 排序文本
4.2 刪除重復
4.3 重新格式化段落
4.4 計算行數、字數以及字元數
4.5 列印
4.6 提取開頭或結尾數行
4.7 小結
第5章 管道的神奇魔力
5.1 從結構化文本文件中提取數據
5.2 針對web的結構型數據
5.3 文字解謎好幫手
5.4 單詞列表
5.5 標簽列表
5.6 小結
第6章 變數、判斷、重復動作
6.1 變數與算術
6.2 退出狀態
6.3 case 語句
6.4 循環
6.5 函數
6.6 小結
第7章 輸入/輸出、文件與命令執行
7.1 標准輸入、標准輸出與標准錯誤輸出
7.2 使用read讀取行
7.3 關於重定向
7.4 printf的完整介紹
7.5 波浪號展開與通配符
7.6 命令替換
7.7 引用
7.8 執行順序與eval
7.9 內建命令
7.10 小結
第8章 產生腳本
8.1 路徑查找
8.2 軟體構建自動化
8.3 小結
第9章 awk的驚人表現
9.1 awk命令行
9.2 awk程序模型
9.3 程序元素..
9.4 記錄與欄位
9.5 模式與操作
9.6 在awk里的單行程序
9.7 語句
9.8 用戶定義函數
9.9 字元串函數
9.10 數值函數
9.11 小結
第10章 文件處理
10.1 列出文件
10.2 使用touch更新修改時間
10.3 臨時性文件的建立與使用
10.4 尋找文件
10.5 執行命令:xargs
10.6 文件系統的空間信息
10.7 比較文件
10.8 小結
第11章 擴展實例:合並用戶資料庫
11.1 問題描述
11.2 密碼文件
11.3 合並密碼文件
11.4 改變文件所有權
11.5 其他真實世界的議題
11.6 小結
第12章 拼寫檢查
12.1 spell程序
12.2 最初的unix拼寫檢查原型
12.3 改良的ispell與aspell
12.4 在awk內的拼寫檢查程序
12.5 小結
第13章 進程
13.1 進程建立
13.2 進程列表
13.3 進程式控制制與刪除
13.4 進程系統調用的追蹤
13.5 進程賬
13.6 延遲的進程調度
13.7 /proc文件系統
13.8 小結
第14章 shell可移植性議題與擴展
14.1 迷思
14.2 bash的shopt命令
14.3 共通的擴展
14.4 下載信息
14.5 其他擴展的bourne式shell
14.6 shell版本
14.7 shell初始化與終止
14.8 小結
第15章 安全的shell腳本:起點
15.1 安全性shell腳本提示
15.2 限制性shell
15.3 特洛伊木馬
15.4 為shell腳本設置setuid:壞主意
15.5 ksh93與特權模式
15.6 小結
附錄a 編寫手冊頁
附錄b 文件與文件系統
附錄c 重要的unix命令
參考書目...
⑶ Shell腳本快速學習指南的前言
剛開始使用UNIX(注1)的用戶與程序員突然面對各式各樣的程序時,都會有很多疑問,例如「它們的功能是什麼」,還有「我怎麼使用它們」。
本書可以回答你這些問題。告訴你如何結合UNIX工具,將其與標準的Shell相結合完成工作。Shell腳本的編寫是門藝術,需要的不只是Shell語言的相關知識,還要你對各個獨立的UNIX程序有基本認識:為什麼會有這些工具,要怎麼單純地使用它們,怎麼將它們與其他程序結合應用。
為什麼需要學習如何編寫Shell命令?因為大部分情況下,中型到大型的問題都能拆成較小的部分,這些小部分也多半都能找到現成的UNIX工具處理。用心編寫的好用Shell腳本常常能夠比C或C++語言編寫的程序更快地解決相同的問題。也可以讓Shell腳本提供可移植性,也就是說,可以跨越UNIX與POSIX兼容的系統,有時僅需略作修改,甚至不必修改,即可使用。.
談到UNIX程序時,我們使用工具(tool)這個字。以UNIX工具箱(toolbox)的做法解決問梁粗題,長久以來以「軟體工具(Software Tools)」哲學(注2)為人所熟知。
瑞士軍刀是很多人口袋裡的好幫手。它有刀刃、螺絲起子、開罐器、牙簽等工具。功能更齊備的,還有其他像拔塞鑽、放大鏡等工具。瑞士軍刀能派上用場的時候很多,雖然用它來修削和進行簡單雕刻很不錯,但悄渣絕你絕不會拿它來蓋狗屋或製作鳥類餵食器。相反,做這類工作時你會尋求更專門的工具,例如鐵槌、鋸子、夾鉗或刨刀等。同理,當你在解決程序化問題時,使用專門的軟體工具會比較好。
這是給誰看的書
這本書是寫給那些在UNIX環境下發現必須寫些Shell腳本,以利於工作進行的計算機用戶與軟體開發人員。例如,你可能是正在念計算科學的學生,手上有學校給你的第一個UNIX系統賬號,你想知道在UNIX下更多的東西,例如你的Windows個人計算機無法處理的那些工作(這種情況下,你通常得寫幾個腳本來定製個人環境)。或者,你可能是個系統管理新手,需要為公司或學校寫幾個專用程序(可能是處理事件日誌文件,賬號、賬單管理之類的事情啟姿)。你也可能是Mac OS的開發老手,但轉到嶄新的Mac OS X的世界,它的安裝程序是以Shell腳本寫成。不管你來自哪裡,如果你想學Shell腳本,這本書就是寫給你的。在這本書里你能學到:
軟體工具設計概念與原則
一些好的軟體工具設計與實例上的實踐規則。我們會解釋這些原則,還會在這本書里貫徹執行。
UNIX工具是什麼
UNIX的核心工具組會在我們編寫Shell腳本時不斷地重復使用。我們會介紹Shell與正則表達式的基本概念,並在解決特定問題時展現各種核心工具的用法。除了介紹工具能做什麼之外,我們還會告訴你,為什麼要使這個工具,為什麼它有這些特殊選項。
《Learning UNIX》這本書是在介紹UNIX系統,讓你從對UNIX毫無經驗成長為會基本操作的用戶。《UNIX in a Nutshell》這本書則是廣泛地介紹UNIX工具包,對於使用時機與特定工具用法的介紹很少。我們的目的就在彌補這兩本書之間的鴻溝:如何靈活運用這些UNIX提供的工具包,讓工作更順暢,更有效率,也更從容(我們的期望)。
何結合所有工具,完成工作
編寫Shell腳本時,其實會是「整體的功能比各部分加起來的總和還強大」。Shell的使用就像整合個別工具的黏著劑,讓你只要花點心思,就能得到驚人的效果。
標准工具幾個常見的擴展
如果你已經是GNU/Linux或BSD系統的用戶,很可能你的工具還有其他額外的、好用的功能或選項。這部分我們也會介紹。
不可或缺的非標准工具
有些程序,在大部分傳統的UNIX系統里並非「標準的」,但我們又不能沒有它。我們會在適當的地方介紹它們,也會提供使用時機的相關信息。
對長期使用UNIX的開發人員與管理者來說,軟體工具的設計原則一直沒有什麼改變。因此,推廣的書籍雖然還算堪用,但已經20年未更新了,甚空更久!UNIX系統在這些書寫成之後,有了許多變動。因此,我們覺得是更新這些想法的時候了,我們利用這些工具的現行版本、在現行系統下展示範例。下面是我們將要強調的部分:
所有的呈現是以POSIX為基礎。POSIX為一系列描述可移植操作系統環境的標准正式名稱的縮寫。POSIX標準是開發人員的挑戰,他們必須兼顧程序與Shell腳本在不同廠商所提供的各種平台上的可移植性。我們將在最新的POSIX標准下展現Shell語言、各個工具程序及其選項
⑷ shell 腳本如何進行調試
Shell提供了一些用於調試腳本的選項,如:
1.-n :讀一遍腳本中的命令但不執行,用於檢查腳本中的語法錯誤。
2.-v :一邊執行腳本,一邊將執行過的腳本命令列印到標准錯誤輸出。
3.-x :提供跟蹤執行信息,將執行的每一條命令和結果依次列印出來。該選項有三種常見的使用方法:
1.在命令行提供參數。如:itcast@itcast$ sh -x ./script.sh
2.在腳本開頭提供參數。如:#! /bin/sh -x
在腳本中用set命令啟用或禁用參數。如:set -x 和 set +x分別表示啟用和禁用-x參數,這樣可以只對腳本中的某一段進行跟蹤調試。
學會了嗎?我也是在黑馬程序員學了C之後會的,現在已經工作了,工資15K,福利待遇挺好的。
⑸ shell腳本是什麼
操作系統與外部最主要的介面就叫做shell。shell是操作系統最外面的一層。shell管理你與操作系統之間的交互:等待你輸入,向操作系統解
釋你的輸入,並且處理各種各樣的操作系統的輸出結果。 shell提供了你與操作系統之間通訊的方式。這種通訊可以以交互方式(從鍵盤輸
入,並且可以立即得到響應),或者以shell script(非交互)方式執行。shell script是放在文件中的一串shell和操作系統命令,它們可以被
重復使用。本質上,shell script是命令行命令簡單的組合到一個文件裡面。 Shell基本上是一個命令解釋器,類似於DOS下的command.com
。它接收用戶命令(如ls等),然後調用相應的應用程序。較為通用的shell有標準的Bourne shell (sh)和C shell (csh)。
互動式shell和非互動式shell 互動式模式就是shell等待你的輸入,並且執行你提交的命令。這種模式被稱作互動式是因為shell與用戶進行交
互。這種模式也是大多數用戶非常熟悉的:登錄、執行一些命令、簽退。當你簽退後,shell也終止了。 shell也可以運行在另外一種模式:非
互動式模式。在這種模式下,shell不與你進行交互,而是讀取存放在文件中的命令,並且執行它們。當它讀到文件的結尾,shell也就終止了。
shell的類型在UNIX中主要有兩大類shell Bourne shell (包括 sh, ksh, and bash) Bourne shell ( sh) Korn shell ( ksh) Bourne Again
shell ( bash) POSIX shell ( sh) C shell (包括 csh and tcsh) C shell ( csh) TENEX/TOPS C shell ( tcsh).
附:LINUX系統的shell原理
Linux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的介面。它是命令語言、命令解釋程序及程序設計語言的統稱。
shell是用戶和Linux內核之間的介面程序,如果把Linux內核想像成一個球體的中心,shell就是圍繞內核的外層。當從shell或其他程序向
Linux傳遞命令時,內核會做出相應的反應。 shell是一個命令語言解釋器,它擁有自己內建的shell命令集,shell也能被系統中其他應用
程序所調用。用戶在提示符下輸入的命令都由shell先解釋然後傳給Linux核心。
⑹ 學生信的那些事兒之七 - Linux基礎之Shell腳本編程
沿著前面的軌跡,接下來是Linux中shell腳本的學習。這對於生信工程師後續處理大量 (海量更合適些) 數據是非常非常重要的,但是同樣的,作為一個有點古板的人,對於"腳本"是什麼意思我都死磕了好久。主要覺得有些抽象,尤其是跟生信的同事討論項目分析部分的問題時,他們經常會說道這個詞,在他們意識里這是個不言自明的術語,殊不知對外行人而言 (比如我),那簡直就是無情的"知識的詛咒"。經常是我假裝聽懂了,然後繼續討論下面的問題,形成一個模糊的印象。
網路上的解釋是:腳本(Script)是一種批處理文件的延伸,是一種純文本保存的程序,一般來說的計算機腳本程序是確定的一系列控制計算機進行運算操作動作的組合,在其中可以實現一定的邏輯分支等。不知道你能不能看懂,反正我開始的時候真是一知半解。
鳥哥私房菜的解釋是:shell script是利用 shell 的功能所寫的一個"程序",這個程序是使用純文本文件,將一些shell的語法與命令(含外部命令)寫在裡面,搭配正則表達式、管道命令與數據流重定向等功能,以達到我們所想要的處理的目的。不明覺厲,好像更看不懂了···
Jude 的簡單粗暴大白話解釋是:腳本就是Linux中很多命令按照一定規則的組合,以實現某個特定的功能。Linux中有很多簡單的命令,往往只是進行了簡單的對話,比如 cd 就是進入到某個目錄,簡單直接。但是如果我想進入某個目錄A,然後在目錄A中創建目錄B,再在目錄B中創建文本C呢?當然可以一步一步操作,如果想要一步到位呢,那就可以用腳本,把三個命令寫在一起,一起執行。好像有點啰嗦···
或者從英語的角度去理解,腳本的對應英文是Script,而這個單詞的中文釋義中還有劇本的意思。劇本就好理解了啊,劇本就是導演(生信工程師)基於某個主旨(要實現的目標)按照一定的手法(規則)所寫的一個故事。不管是哪個演員,都得按照劇本演。所以,學好英語對於生信也是有幫助的~
按照腳本的復雜程度可以分為:
這個無需多說,其實就是若干個簡單命令的順序排列,執行腳本後會按照命令的前後關系從前往後一一執行。
相對於簡單的基本腳本,結構化的命令腳本可以施加邏輯流程式控制制,從而改變程序(命令)執行的順序。基本腳本中的命令就是從上往下執行,但是結構化的命令腳本可以根據邏輯判斷重復或者跳過某些命令。
常用的結構化命令(語句)有:
後面還有什麼嵌套循環啊啥的,不過我覺得上面的7中命令學到家了,應該可以應付大部分在生信分析裡面的應用了。
記得高中的時候,物理老師(也是班主任)在給我們講解習題時有個有意思的套路:不管什麼難題現在下面寫個"答:",以示自己解決問題的決心,也是一種正向的心理暗示。腳本編寫也是有套路的,不過總的來說還是比較簡單。
對於簡單的腳本(超級簡單的那種),直接幾個命令連在一起即可,中間用";"隔開。
對於更長更復雜的腳本,一般需要創建一個文本,並在裡面編輯。這就涉及到了文本編輯器,比較常用和簡單的一般有nano和vim,實在很簡單,規則也容易理解,教程隨手可得,不多說。
比如用vim創建了一個腳本之後,具體的語法(套路):
ok,腳本寫完了,怎麼讓腳本開始工作呢?這有涉及到之前講過的環境變數和相對路徑、絕對路徑了。方法有三:
就這么多吧,應該有點感覺到了,剩下的就是狂練狂練了~