Linux必備技能——Shell腳本學習筆記(1)

    現在我們用的操作系統(Windows、Mac OS、Android、iOS 等)都是帶圖形界面的,簡單直觀,容易上手,對專業用戶(程序員、網管等)和普通用戶(家庭主婦、老年人等)都非常適用。然而在計算機早期並沒有圖形界面,只能通過一個個的命令來控制控制計算機,這些命令成千上萬,先不說這些命令記不記得住,每天面對沒有任何色彩的黑屏就是一件很難受的事。其實通過圖形界面和命令行開啓某個程序過程都是類似的,都需要查找程序在硬盤上的位置,然後將他們加載到內存中運行。本質都是:讓用戶控制計算機
    然而,真正能夠控制計算機硬件(CPU、內存、顯示器等)的只有操作系統內核(Kernel),圖形界面和命令行只是架設在用戶和內核之間的一座橋樑
    由於安全、複雜、繁瑣等原因,用戶不能直接接觸內核(也沒有必要),需要另外再開發一個程序,讓用戶直接使用這個程序;該程序的作用就是接收用戶的操作(點擊圖標、輸入命令),並進行簡單的處理,然後再傳遞給內核,這樣用戶就能間接地使用操作系統內核了。

在這裏插入圖片描述

Shell的本質

       用戶界面和命令行就是這個另外開發的程序,就是這層“代理”。在Linux下,這個命令行程序叫做 Shell。Shell 是一個應用程序,它連接了用戶和 Linux 內核,讓用戶能夠更加高效、安全、低成本地使用 Linux 內核,這就是 Shell 的本質

Shell連接用戶和內核

        Shell 能接收用戶輸入的命令,並對命令進行處理,處理完命令後再將結果反饋給用戶,比如輸出到顯示器、寫入到文件等。你看,我一直都在使用 Shell,哪有使用內核哦?我也沒有看到 Shell 將我和內核連接起來呀?

       其實,Shell 程序本身的功能是很弱的,比如文件操作、輸入輸出、進程管理等都得依賴內核。我們運行一個命令,大部分情況下 Shell 都會去調用內核暴露出來的接口,這就是在使用內核,只是這個過程被 Shell 隱藏了起來,它自己在背後默默進行,我們看不到而已。

        接口其實就是一個一個的函數,使用內核就是調用這些函數。這就是使用內核的全部內容了嗎?對!除了函數,你沒有別的途徑使用內核。

Shell連接其他程序

        在 Shell 中輸入的命令,有一部分是 Shell 本身自帶的,這叫做內置命令;有一部分是其它的應用程序(一個程序就是一個命令),這叫做外部命令

        Shell 本身支持的命令不多,功能也有限,但是 Shell 可以調用其他的程序,每個程序就是一個命令,這使得 Shell 命令的數量可以無限擴展,其結果就是 Shell 的功能非常強大,完全能夠勝任 Linux 的日常管理工作,如文本或字符串檢索、文件的查找或創建、大規模軟件的自動部署、更改系統設置、監控服務器性能、發送報警郵件、抓取網頁內容、壓縮文件等。

        更加厲害的就是,Shell 還可以讓多個外部程序發生連接,在它們之間很方便地傳遞數據,也就是把一個程序的輸出結果傳遞給另一個程序作爲輸入。

        由此可見Shell的功能強大之處並不是本身,而是它擅長使用和組織其他的程序。Shell 就是一個領導者,這正是 Shell 的魅力所在。

        可以將 Shell 在整個 Linux 系統中的地位描述成下圖所示:
在這裏插入圖片描述
注意:由於用戶啓動 Linux 後直接面對的是 Shell,通過 Shell 才能運行其它的應用程序,所以用戶”和“其它應用程序”是通過虛線連接的

支持編程的Shell

       Shell 並不是簡單的堆砌命令,我們還可以在 Shell 中編程,這和使用 C++、C#、Java、Python 等常見的編程語言差不多。
       Shell 雖然沒有 C#、Java、Python 等強大,但也支持基本的編程元素,例如:
if…else 選擇結構,case…in 開關語句,for、while、until 循環;
變量、數組、字符串、註釋、加減乘除、邏輯運算等概念;
函數,包括用戶自定義的函數和內置函數(例如 printf、export、eval 等)。
       從這個角度講,Shell 也是一種編程語言,它的編譯器(解釋器)是 Shell 這個程序。我們平時所說的 Shell,有時候是指連接用戶和內核的這個程序,有時候又是指 Shell 編程。
       Shell 主要用來開發一些實用的、自動化的小工具,而不是用來開發具有複雜業務邏輯的中大型軟件,例如檢測計算機的硬件參數、搭建 Web 運行環境、日誌分析等,Shell 都非常合適。

使用腳本語言的Shell

在計算機中,任何代碼最終都要轉換爲二進制的形式才能在計算機中執行。
       有的編程語言,比如C/C++、GO語言等必須要將所有的代碼翻譯成二進制形式(也就是生成可執行文件)然後才能執行,因而執行速度更快、效率更高對硬件的要求低。
       這個過程叫做編譯(Compile),這樣的編程語言叫做編譯型語言,完成編譯過程的軟件叫做編譯器(Compiler)。

       而有的編程語言,如Shell、python、PHP等,需要一邊執行一邊翻譯不會生成任何可執行文件。用戶必須拿到源碼才能執行,程序運行後會及時翻譯,翻譯一部分執行一部分,不用等到所有的代碼全部翻譯完。
       這個過程叫做解釋,這樣的編程語言叫做解釋型語言或者腳本語言(Script),完成解釋過程的軟件叫做解釋器。

兩種類型語言的比較:

語言類型 特點 適用範圍
編譯性語言 執行速度快、對硬件要求低、保密性好 開發操作系統、大型應用程序等
解釋性語言 使用靈活、部署簡單、跨平臺性好 適合WEB開發以及製作小工具

常見的幾種Shell

常見的 Shell 有 sh、bash、csh、tcsh、ash 等。

  • sh
    sh 的全稱是 Bourne shell,由 AT&T 公司的 Steve Bourne開發,爲了紀念他,就用他的名字命名了。
    sh 是 UNIX 上的標準 shell,很多 UNIX 版本都配有 sh,sh 是第一個流行的 Shell。
  • csh
    sh 之後另一個廣爲流傳的 shell 是由柏克萊大學的 Bill Joy 設計的,這個 shell 的語法有點類似C語言,所以才得名爲 C shell ,簡稱爲 csh。
    Bill Joy 是一個風雲人物,他創立了 BSD 操作系統,開發了 vi 編輯器,還是 Sun 公司的創始人之一。
    BSD 是 UNIX 的一個重要分支,後人在此基礎上發展出了很多現代的操作系統,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就連 Mac OS X 在很大程度上也基於BSD。
  • tcsh
    tcsh 是 csh 的增強版,加入了命令補全功能,提供了更加強大的語法支持。
  • ash
    一個簡單的輕量級的 Shell,佔用資源少,適合運行於低內存環境,但是與接下來講到的 bash shell 完全兼容。
  • bash
    bash shell 是 Linux 的默認 shell
    bash 由 GNU 組織開發,保持了對 sh shell 的兼容性,是各種 Linux 發行版默認配置的 shell。bash 兼容 sh 意味着,針對 sh 編寫的 Shell 代碼可以不加修改地在 bash 中運行。儘管如此,bash 和 sh 還是有一些不同之處:一方面,bash 擴展了一些命令和參數;另一方面,bash 並不完全和 sh 兼容,它們有些行爲並不一致,但在大多數企業運維的情況下區別不大,特殊場景可以使用 bash 代替 sh。

第一個Shell腳本

       幾乎所有編程語言的教程都是從使用著名的“Hello World”開始的,作爲中國人要弘揚傳統,我的第一個 Shell 腳本也從輸出“Hello World”開始。

①打開Linux終端,通過文本編輯器創建一個名字爲test.sh的文件。

②給文件輸入以下內容:

#!/bin/bash
echo "Hello World !"  #這是一條語句

       第 1 行的#!是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell;後面的/bin/bash就是指明瞭解釋器的具體位置。
       第 2 行的 echo 命令用於向標準輸出文件(Standard Output,stdout,一般就是指顯示器)輸出文本。在.sh文件中使用命令與在終端直接輸入命令的效果是一樣的。
       第 2 行的**#及其後面的內容是註釋**。Shell 腳本中所有以#開頭的都是註釋(當然以**#!開頭的除外**)。寫腳本的時候,多寫註釋是非常有必要的,以方便其他人能看懂你的腳本,也方便後期自己維護時看懂自己的腳本。

③退出保存文件內容

④通過ls -l test.sh查看文件權限
       我們會發現文件權限是可讀可寫,卻不可執行,這是因爲它只是一個文本文件。當然不能執行嘍!
在這裏插入圖片描述
       那麼接下來我們就要通過chmod 命令來給文件賦予執行的權限
⑤通過命令chmod test.sh給文件賦予可執行權限
       執行命令後再次查看文件的權限時發現文件已經可以執行了。
在這裏插入圖片描述
⑥通過命令./test.sh執行腳本
       會發現控制檯已經打印出來了Hello World !

爲什麼什麼要加這個./呢?是不是有點多餘呢?
       當我們把./去掉時會發現控制檯會打印“command not found”,這又是爲什麼呢?這是因爲在Shell的標準搜索路徑($PATH)中找不到test.sh因此加上./是很有必要的。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章