- 跟老韓學Linux自動化運維(基礎篇)
- 韓艷威
- 1225字
- 2022-10-26 16:40:11
1.2 Shell的基本概念
Shell是Linux操作系統指令集的概稱,是屬于操作系統層面的、基于指令集的人機交互界面的腳本級程序運行環境。
Shell是一種操作系統的應用級腳本。Shell腳本提供了一個人機交互界面,用戶通過該界面訪問可操作系統內核的服務。
1.初識Shell腳本
計算機只能理解由0和1組成的二進制語言。
早期計算機通過二進制語言來執行指令。二進制語言對人類來說難以理解,讀、寫都很不友好。后來,操作系統里提供了一種叫作Shell的特殊程序,Shell接收英文格式(大多數情況下是英文)指令,如果指令有效,就會被傳遞給內核,并執行一系列操作。
Shell是用戶和Linux內核溝通的“橋梁”,用戶的大部分工作是通過Shell完成的。Shell既是一種指令語言,又是一種腳本設計語言。作為指令語言,它交互式地解釋和執行用戶輸入的指令;作為腳本設計語言,它定義了各種變量和參數,并提供了許多在高級語言中才具有的控制結構,包括循環和分支。
Shell腳本不是Linux內核的一部分,但它調用了系統核心的大部分功能來執行腳本、建立文件,并以并行的方式協調各個腳本的運行。因此,對用戶來說,Shell腳本是重要的實用腳本,深入了解和熟練掌握Shell腳本的特性及其使用方法,是用好Linux的關鍵。實際上,Shell可被看作一個提供給用戶用來交互的軟件,它可以通過標準輸入設備(通常是鍵盤)或者文件讀取指令,并且解釋執行用戶的指令。
用戶與Shell交互的過程如圖1-1所示。

圖1-1 用戶與Shell交互的過程
Shell通過系統調用來執行腳本,如創建文件等。Linux中包含各種不同版本的Shell,查看當前操作系統支持哪些Shell類型,代碼如下。
[root@laohan_httpd_server ~]# cat /etc/Shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/bash
查看當前操作系統默認使用的Shell類型,代碼如下。
1 [root@laohan_httpd_server ~]# echo $SHELL
2 /bin/bash
3 [root@laohan_httpd_server ~]#
從上述代碼第2行中可以看到,當前操作系統默認使用的Shell類型是Bash程序。
2.Shell腳本執行方式
Shell腳本有如下兩種執行方式。
(1)交互式(Interactive)。Shell解釋器執行用戶輸入的指令,用戶輸入一條指令,Shell解釋器執行一條。
[root@laohan-Shell-1 ~]# date
2019年12月 06日星期五 15:27:39 CST
[root@laohan-Shell-1 ~]# whoami
root
[root@laohan-Shell-1 ~]# echo "我的名字是老韓"
我的名字是老韓
上述代碼中,用戶輸入的指令會逐條執行,結果會輸出到當前終端(顯示器)。
(2)批處理。用戶可事先寫一個Shell腳本(Script)文件,腳本文件中有很多條指令,Shell解釋器可以一次性把這些指令執行完畢,并將指令運行狀態返回給用戶。
1 [root@laohan-Shell-1 chapter-1]# cat multi-command.sh
2 uname -n
3 current_date=$(date +%F-%T)
4 echo $current_date
5 whoami
6 echo
7 echo "我的名字是老韓"
8 echo $?
上述代碼第2~8行會依次執行,輸出結果如下。
[root@laohan-Shell-1 chapter-1]# bash multi-command.sh
laohan-Shell-1
2019-12-06-15:29:43
root
我的名字是老韓
0
3.Shell腳本的局限性
Shell只定義了一種非常簡單的編程語言,如果腳本復雜度較大,或者要操作的數據結構比較復雜,建議使用Python等其他編程語言解決對應的問題。
建議根據不同的使用場景有選擇性地使用不同的編程語言。因為Shell在處理復雜的業務邏輯(如前后端數據交互)方面的能力很弱,此時建議使用Python腳本進行處理,Shell腳本的局限性如下。
● Shell腳本中函數只能返回字符串,無法返回數組。
● Shell腳本不支持面向對象,無法實現一些優雅的設計模式。
● Shell腳本是解釋型語言,邊解釋邊執行。如果腳本包含錯誤(如調用了不存在的函數),只要沒調用函數代碼庫,系統就不會報錯。