初識Shell
轉自計算就該這么學
一、程序
1、什么是程序
程序是為實現特定目標或解決特定問題而用計算機語言編寫的命令序列的集合。簡單來說,電腦里面的應用都是程 序來控制的,程序天天見。程序是由序列組成的,告訴計算機如何完成一個具體的任務。由于現在的計算機還不能 理解人類的自然語言,所以還不能用自然語言編寫計算機程序,不過現在語音識別技術己經很歷害了,在不久的將 來,估計,電腦就自己會編程序了。
2、程序能做什么?
電腦控制手機控制機械控制物聯控制。一切自動化制造的系統,都是由程序來控制的。
3、什么是編程?
編程 是個動詞,編程==寫代碼,寫代碼為了什么? 為了讓計算機干你想要干的事情,比如,馬化騰想跟別人聊天, 于是寫了個聊天軟件,這個軟件就是一堆代碼的集合,這些代碼是什么?這些代碼是計算機能理解的語言。
二、語言
1、那計算能理解的語言是什么呢 ?
計算機只能理解2進制,0101010...,總不能人肉輸一堆二進制給計算機(雖然最原始的計算機就是這么干的)讓它工 作吧,這樣開發速度太慢了。所以最好的辦法就是人輸入簡單的指令,計算機能把指令轉成二進制進行執行,
2、有哪些編程語言?
編程語言總體分以為機器語言、匯編語言、高級語言
1)機器語言
由于計算機內部只能接受二進制代碼,因此,用二進制代碼0和1描述的指令稱為機器指令,全部機器指令的 集合構成計算機的機器語言,用機器語言編程的程序稱為目標程序。只有目標程序才能被計算機直接識別和 執行。但是機器語言編寫的程序無明顯特征,難以記憶,不便閱讀和書寫,且依賴于具體機種,局限性很 大,機器語言屬于低級語言。
用機器語言編寫程序,編程人員要首先熟記所用計算機的全部指令代碼和代碼的涵義。手編程序時,程序員 得自己處理每條指令和每一數據的存儲分配和輸入輸出,還得記住編程過程中每步所使用的工作單元處在何 種狀態。這是一件十分繁瑣的工作。編寫程序花費的時間往往是實際運行時間的幾十倍或幾百倍。而且,編 出的程序全是些0和1的指令代碼,直觀性差,還容易出錯。除了計算機生產廠家的專業人員外,絕大多數的 程序員已經不再去學習機器語言了。
機器語言是微處理器理解和使用的,用于控制它的操作二進制代碼。
2)匯編語言
匯編語言的實質和機器語言是相同的,都是直接對硬件操作,只不過指令采用了英文縮寫的標識符,更容易 識別和記憶。它同樣需要編程者將每一步具體的操作用命令的形式寫出來。
匯編程序的每一句指令只能對應實際操作過程中的一個很細微的動作。例如移動、自增,因此匯編源程序一 般比較冗長、復雜、容易出錯,而且使用匯編語言編程需要有更多的計算機專業知識,但匯編語言的優點也 是顯而易見的,用匯編語言所能完成的操作不是一般高級語言所能夠實現的,而且源程序經匯編生成的可執 行文件不僅比較小,而且執行速度很快。
3)高級語言
高級語言是大多數編程者的選擇。和匯編語言相比,它不但將許多相關的機器指令合成為單條指令,并且去 掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指 令。同時,由于省略了很多細節,編程者也就不需要有太多的專業知識。
高級語言主要是相對于匯編語言而言,它并不是特指某一種具體的語言,而是包括了很多編程語言,像最簡 單的編程語言PASCAL語言也屬于高級語言。
高級語言所編制的程序不能直接被計算機識別,必須經過轉換才能被執行,按轉換方式可將它們分為兩類:
編譯類
編譯是指在應用源程序執行之前,就將程序源代碼“翻譯”成目標代碼(機器語言),因此其目標程序可 以脫離其語言環境獨立執行(編譯后生成的可執行文件,是cpu可以理解的2進制的機器碼組成的),使用 比較方便、效率較高。但應用程序一旦需要修改,必須先修改源代碼,再重新編譯生成新的目標文件(* .obj,也就是OBJ文件)才能執行,只有目標文件而沒有源代碼,修改很不方便。
編譯后程序運行時不需要重新翻譯,直接使用編譯的結果就行了。程序執行效率高,依賴編譯器,跨平 臺性差些。如C、C++、Delphi等
解釋類
執行方式類似于我們日常生活中的“同聲翻譯”,應用程序源代碼一邊由相應語言的解釋器“翻譯”成目標代 碼(機器語言),一邊執行,因此效率比較低,而且不能生成可獨立執行的可執行文件,應用程序不能 脫離其解釋器(想運行,必須先裝上解釋器,就像跟老外說話,必須有翻譯在場),但這種方式比較靈活, 可以動態地調整、修改應用程序。如Shell,Python、Java、PHP、Ruby等語言。
4)總結
機器語言
優點是最底層,速度最快,缺點是最復雜,開發效率最低
匯編語言
優點是比較底層,速度最快,缺點是復雜,開發效率最低
高級語言
編譯型語言執行速度快,不依賴語言環境運行,跨平臺差
解釋型跨平臺好,一份代碼,到處使用,缺點是執行速度慢,依賴解釋器運行
三、Shell 的定義
1、Shell 的含義
首先Shell的英文含義是“殼”;它是相對于內核來說的,因為它是建立在內核的基礎上,面向于用戶的一種表現形 式,比如我們看到一個球,見到的是它的殼,而非核。Linux中的Shell,是指一個面向用戶的命令接口,表現形式 就是一個可以由用戶錄入的界面,這個界面也可以反饋運行信息;
2、Shell 在Linux中的存在形式
由于Linux不同于Windows,Linux是內核與界面分離的,它可以脫離圖形界面而單獨運行,同樣也可以在內核的 基礎上運行圖形化的桌面。這樣,在Linux系統中,就出現了兩種Shell表現形式,一種是在無圖形界面下的終端運 行環境下的Shell,另一種是桌面上運行的類似Windows 的MS-DOS運行窗口,前者我們一般習慣性地簡稱為終 端,后者一般直接稱為Shell
3、Shell 如何執行用戶的指令
1)Shell有兩種執行指令的方式,
第一種方法是用戶事先編寫一個sh腳本文件,內含Shell腳本,而后使用Shell程序執行該腳本,這種方式,我 們習慣稱為Shell編程。
第二種形式,則是用戶直接在Shell界面上執行Shell命令,由于Shell界面的關系,大家都習慣一行行的書寫, 很少寫出成套的程序來一起執行,所以也稱命令行。
總結
Shell 只是為用戶與機器之間搭建成的一個橋梁,讓我們能夠通過Shell來對計算機進行操作和交互,從而達到 讓計算機為我們服務的目的。
四、Shell 的分類
Linux中默認的Shell是/bin/bash,流行的Shell有ash、bash、ksh、csh、zsh等,不同的Shell都有自己的特點以 及用途。
1、bash
大多數Linux系統默認使用的Shell,bash Shell是Bourne Shell 的一個免費版本,它是最早的Unix Shell,bash 還有一個特點,可以通過help命令 來查看幫助。包含的功能幾乎可以涵蓋Shell所具有的功能,所以一般的Shell腳本都會指定它為執行路徑。
2、csh
C Shell 使用的是“類C”語法,csh是具有C語言風格的一種Shell,其內部命令有52個,較為龐大。目前使用的 并不多,已經被/bin/tcsh所取代。
3、ksh
Korn Shell 的語法與Bourne Shell相同,同時具備了C Shell的易用特點。許多安裝腳本都使用ksh,ksh 有42條 內部命令,與bash相比有一定的限制性。
4、tcsh
tcsh是csh的增強版,與C Shell完全兼容。
5、sh
是一個快捷方式,已經被/bin/bash所取代。
6、nologin
指用戶不能登錄
7、zsh
目前Linux里最龐大的一種 zsh。它有84個內部命令,使用起來也比較復雜。一般情況下,不會使用該Shell。
五、Shell 能做什么
自動化批量系統初始化程序 (update,軟件安裝,時區設置,安全策略...)
自動化批量軟件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
應用管理程序 (KVM,集群管理擴容,MySQL,DELLR720批量RAID)
日志分析處理程序(PV, UV, 200, !200, top 100, grep/awk)
自動化備份恢復程序(MySQL完全備份/增量 + Crond)
自動化管理程序(批量遠程修改密碼,軟件升級,配置更新)
自動化信息采集及監控程序(收集系統/應用狀態信息,CPU,Mem,Disk,Net,T CP Status,Apache,MySQL)
配合Zabbix信息采集(收集系統/應用狀態信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
自動化擴容(增加云主機——>業務上線)
zabbix監控CPU 80%+|-50% Python API AWS/EC2(增加/刪除云主機) + Shell Script(業務上線)
俄羅斯方塊,打印三角形,打印圣誕樹,打印五角星,運行小火車,坦克大戰,排序算法實現
Shell可以做任何事(一切取決于業務需求)