Shell基礎 -Linux從入門到精通第九天

来源:https://www.cnblogs.com/WUXIAOCHANG/archive/2019/05/21/10899803.html
-Advertisement-
Play Games

文章大綱 一、關於shell二、shell進階(重點)三、學習資料下載四、參考文章 一、關於shell 1. 什麼是shell 1.1 shell簡介 Shell(外殼) 是一個用 C 語言編寫的程式,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程式設計語言。 Shell ...


文章大綱

一、關於shell
二、shell進階(重點)
三、學習資料下載
四、參考文章

 

一、關於shell

1. 什麼是shell

1.1 shell簡介
  Shell(外殼) 是一個用 C 語言編寫的程式,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程式設計語言。
  Shell 是指一種應用程式,這個應用程式提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。

1.2 什麼是腳本?
  腳本簡單地說就是一條條的文字命令,這些文字命令是可以看到的(如可以用記事本打開查看、編輯)。
  常見的腳本: JavaScript(JS,前端),VBScript, ASP,JSP,PHP(後端),SQL(資料庫操作語言),Perl,Shell,python,Ruby,JavaFX,Lua等。

1.3 為什麼要學習和使用shell?
  Shell屬於內置的腳本
  程式開發的效率非常高,依賴於功能強大的命令可以迅速地完成開發任務(批處理)
  語法簡單,代碼寫起來比較輕鬆,簡單易學

1.4 常見的shell種類?
在linux中有很多類型的shell,不同的shell具備不同的功能,shell還決定了腳本中函數的語法,Linux中預設的shell是/bin/bash(重點),流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特點以及用途。

csh
C shell 使用的是“類C”語法,csh是具有C語言風格的一種shell,其內部命令有52個,較為龐大。目前使用的並不多,已經被/bin/tcsh所取代。

ksh
Korn shell 的語法與 Bourne shell 相同,同時具備了 C shell 的易用特點。許多安裝腳本都使用 ksh ,ksh有42條內部命令,與bash相比有一定的限制性。

tcsh
tcsh是csh的增強版,與 C shell 完全相容。

sh
是一個快捷方式,已經被/bin/bash所取代。

nologin
指用戶不能登錄

 

zsh
目前Linux里最龐大的一種shell:zsh。它有84個內部命令,使用起來也比較複雜。一般情況下,不會使用該shell。

bash
大多數Linux系統預設使用的shell,bash shell 是 Bourne shell 的一個免費版本,它是最早的 Unix shell,bash還有一個特點,可以通過help命令來查看幫助。包含的功能幾乎可以涵蓋shell所具有的功能,所以一般的shell腳本都會指定它為執行路徑。

2. shell入門

編寫規範:
代碼規範:
#!/bin/bash [指定告知系統當前這個腳本要使用的shell解釋器]
Shell相關指令

文件命名規範:
文件名.sh .sh是linux下bash shell 的預設尾碼

使用流程:
①創建.sh文件 touch/vim
②編寫shell代碼
③執行shell腳本 腳本必須得有執行許可權

案例1:創建test.sh,實現第一個shell腳本程式,輸出hello world.
輸出命令:#echo 123
註意:輸出的內容如果包含字母和符號(不包含變數),則需要用引號包括起來。如果是純數字可以包也可以不包。

   

註意,這裡在運行時一定要寫成 ./test.sh,而不是 test.sh,運行其它二進位的程式也一樣,直接寫 test.sh,Linux 系統會去 PATH(環境變數) 里尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的當前目錄通常不在 PATH 里,所以寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統說,就在當前目錄找。

案例2:使用root用戶帳號創建並執行test2.sh,實現創建一個shelltest用戶,併在其家目錄中新建文件try.html。

 

腳本執行的另外一個方式:/bin/bash 腳本的路徑(瞭解)

 

Shell腳本分為簡單的寫法(簡單命令的堆積)和複雜寫法(程式的設計)

二、shell進階(重點)

1. 變數(重點)

1.1 變數的含義
a. 什麼是量
量就是數據.
b. 什麼是變數
數據可以發生改變就是變數.
在一個腳本周期內,其值可以發生改變的量就是變數.
c. 什麼叫做一個腳本周期
一個腳本周期我們可以簡單的理解為當前的shell文件

變數是shell中不可或缺的一部分,也是最基礎、最重要的組成部分。

1.2 變數的定義與使用(重點)
變數,先定義後使用。

定義形如:class_name="yunwe "
使用形如:echo $class_name

變數就是由2部分組成,一個是變數名(左邊),另外一部分是變數的值(右邊)
變數名和變數值是什麼關係??
變數名和變數值是使用和被使用關係; 我們的變數名來使用變數值;

在使用變數的時候一定需要在變數名前面添加一個$符號,該要求在其他語言中也存在的(例如php)。

變數名的規範
註意,變數名後面的等號左右不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變數名的命名須遵循如下規則:
命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
中間不能有空格,可以使用下劃線“_”。
不能使用標點符號。
不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。

案例1:使用變數改寫入門腳本中的第1個shell腳本。

   

關於單雙引號的問題:
雙引號能夠識別變數,雙引號能夠實現轉義(類似於“*”)
單引號是不能識別變數,只會原樣輸出,單引號是不能轉義的

案例2:定義一個變數,輸出當前時間,要求格式為“年-月-日 時:分:秒”。

 

註意:反引號(esc鍵下方的那個鍵),當在腳本中需要執行一些指令並且將執行的結果賦給變數的時候需要使用“反引號”。

 

1.3 只讀變數(瞭解)
語法:readonly 變數名
案例:定義變數a並且其值為10,隨後設置其為只讀變數,再去嘗試重新賦值

   

1.4 接收用戶輸入(重點)
語法:read -p 提示信息 變數名
案例:編寫一個腳本test6.sh,要求執行之後提示用戶輸入文件的名稱(路徑),然後自動為用戶創建該文件

   

1.5 刪除變數(瞭解)
語法:unset 變數名
案例:定義變數b=20,再輸出b的值,隨後刪除b,最後再輸出下b

   

2. 條件判斷語句

  老婆給當程式員的老公打電話:下班順路買一斤包子帶回來,如果看到賣西瓜的,買一個。當晚,程式員老公手捧一個包子進了家門…老婆怒道:你怎麼就買了一個包子?!老公答曰:因為看到了賣西瓜的。
  把程式員老婆的話當作一段需求分析一下吧。買一斤包子是一個確定無疑的需求項,無論後面是什麼情況什麼條件,前面這一斤包子是肯定要買的。看到賣西瓜的是一個條件判斷,後面“買一個”是一個模糊不清的需求項,買一個什麼呢?需求里沒說啊。客戶把這個當作開發人員預設瞭解的內容了。可是作為一個成熟合格的程式員,該老婆的丈夫應該馬上跟進確認需求“買一個什麼?”,要不然程式可怎麼寫呢?所以笑話里該程式員是不合格的,起碼是不積極不負責的。在沒有明確需求的情況下,他只能按照自己的理解來完成工作了。那比較可能的結果就有如下幾種:
(1)看到賣西瓜的,買一個西瓜
  如果 看到賣西瓜的
  那麼
  買一個西瓜
  否則
  買一斤包子
(2)看到賣西瓜的,買一個包子
  如果 看到賣西瓜的
  那麼
  買一個包子
(3)看到賣西瓜的,買一個賣西瓜的
(4)看到賣西瓜的,買一個老婆一直想買的東西
(5)看到賣西瓜的,隨便買一個東西

上述1和2下麵的條件漢字描述稱之為“偽代碼”,也是屬於條件表達式的語法。

語法1(一個條件):

if condition
then
    command1 
    command2
fi

單行寫法(一般在命令行中執行的時候):if [ condition ]; then command; fi

語法2(兩個條件):

if condition
then
    command1 
    command2
    ...
else
    command
fi

語法3(多個條件):

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

3. 運算符

在shell中,運算符和其他編程腳本語言一樣,常見的有算數運算符、關係運算符、邏輯運算符、字元串運算符、文件測試運算符等

3.1 算數運算符
下表列出了常用的算術運算符,假定變數 a 為 10,變數 b 為 20:

 

原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
expr 是一款表達式計算工具,使用它能完成表達式的求值操作。
例如,兩個數相加(註意使用的是反引號 ` 而不是單引號 '):

#!/bin/bash
val=`expr 2 + 2`
echo "兩數之和為 : $val"

兩點註意:
表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣。
完整的表達式要被  包含,註意這個字元不是常用的單引號,在 Esc 鍵下邊。

   

3.2 關係運算符
關係運算符只支持數字,不支持字元串,除非字元串的值是數字。
下表列出了常用的關係運算符,假定變數 a 為 10,變數 b 為 20:

 

-eq:equal
-ne:not equal
-gt:great than
-lt:less than
-ge:great than or equal
-le:less than or equal

案例:使用a=10,b=20來實現本案例

   

課堂作業:
寫一個腳本,判斷當前輸入的用戶是否存在。如果存在則提示“用戶存在”否則提示“用戶不存在”。

 

3.3 邏輯運算符
下表列出了常用的布爾運算符,假定變數 a 為 10,變數 b 為 20:

 

或運算:一個為真即為真,全部為假才是假
與運算:一個為假即為假,全部為真才是真

 

3.4 字元串運算符
下表列出了常用的字元串運算符,假定變數 a 為 "abc",變數 b 為 "efg":

   

案例:將上述的語法驗證下

 

3.5 文件測試運算符(重點)
文件測試運算符用於檢測 Unix/Linux 文件的各種屬性。
屬性檢測描述如下:

   

案例:測試上述標綠色的效果

 

註意:許可權幾個判斷,如果只有一個部分符合,則認為是有許可權的。

4. shell腳本附帶選項(重點)

問題描述:在linux shell中如何處理tail -10 access.log這樣的命令行選項?
步驟:
調用tail指令
系統把後續選項傳遞給tail
Tail先去打開指定的文件
取出最後10行

問題:自己寫的shell是否也可以像內置命令一樣傳遞一些選項呢?
答:可以的,傳遞方式與上述的描述是一樣的,關鍵是怎麼接收。例如:
傳遞:

#./test.sh  a  b  c

接收:
在腳本中可以用“1”來表示a,“2”來表示b,以此類推。

接收可以用“$”加上選項對應的序號即可。
測試:編寫test14.sh,傳遞a,b,c,輸出其值

 

其實1、2是變數。

練習:創建自定義指令“user”,可以直接執行,要求該指令具備以下語法和功能:
a. #user -add 用戶名 【添加用戶】
b. #user -del 用戶名 【刪除用戶及其家目錄】

 

同時題目中要求是指令,所以可以再去添加個別名:

 

三、學習資料下載

鏈接:https://pan.baidu.com/s/1c0Oc2sopafpW9CwK1kfauA
提取碼:tla4

四、參考文章

https://blog.csdn.net/w1416520110/article/details/79987578


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉自:微信授權錯誤:"errcode":40163,"errmsg":"codebeenused 微信網頁授權獲取code值回調兩次的問題 1.說是功能變數名稱原因,目前未測試,沒有正確的功能變數名稱 問題描述:在調用微信網頁授權獲取openid值時,先獲取的code值,但是code值的介面 會走兩次回調。而cod ...
  • 配置KeepAlive支持雙節點nginx高可用。本文從nginx的安裝、keepalived的安裝與配置、nginx-keepalived高可用等三個過程進行實驗。 ...
  • 文章大綱 一、課程內容總結二、課程學習地址三、學習資料下載四、參考文章 一、課程內容總結 二、課程學習地址 第一天:https://www.cnblogs.com/WUXIAOCHANG/p/10893343.html第二天:https://www.cnblogs.com/WUXIAOCHANG/p ...
  • 文章大綱 一、編譯安裝與卸載Nginx二、關於LAMP三、LAMP環境部署四、學習資料下載五、參考文章 一、編譯安裝與卸載Nginx Nginx:是一款比較流行的web伺服器軟體,類似於Apache。 1. Ngnix基礎知識與Windows版本安裝 https://www.cnblogs.com/ ...
  • 配置MySQL的主從複製與讀寫分離。MySQL主庫負責數據寫入和數據修改的操作,MySQL從庫負責資料庫讀取任務的操作。在此基礎上通過配置mysql-proxy進行MySQL資料庫的讀寫分離,將讀資料庫請求轉發到從庫伺服器,將寫操作和修改操作轉發到主庫伺服器。 ...
  • 命令如下: ...
  • 文章大綱 一、關於資料庫二、MySQL的安裝與初始化三、MySQL的基本操作(難點)四、擴展五、學習資料下載六、參考文章 一、關於資料庫 mysql的基礎知識,可以參考文章:https://www.cnblogs.com/WUXIAOCHANG/p/10885361.html 二、MySQL的安裝與 ...
  • 任務 1 基本概念 從系統的角度看,任務是競爭系統資源的最小運行單元。任務可以使用或等待CPU、使用記憶體空間等系統資源,並獨立於其它任務運行。 Huawei LiteOS的任務模塊可以給用戶提供多個任務,實現了任務之間的切換和通信,幫助用戶管理業務程式流程。這樣用戶可以將更多的精力投入到業務功能的實 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...