1. 程式人生 > >Linux Shell 程式設計基礎

Linux Shell 程式設計基礎

什麼是shell?

在Linux核心與使用者之間的直譯器程式

— 通常指/bin/bash(預設直譯器)

— 負責向核心翻譯及傳達使用者/程式指令

—相當於作業系統的“外殼”

Image

 

  • 互動式    ——命令列

— 人工干預、智慧化程度高;

— 逐條解釋執行、效率低;

  • 非互動式 ——指令碼

        — 需要提前設計、智慧化難度大;

        — 批量執行、效率高;

        — 方便在後臺靜悄悄地執行;

 

shell就類似於汽車這個概念,那麼bash就比喻為具體的品牌型號,比如寶馬M2、M3。

 

/etc/shells 這個檔案是儲存系統中有多少shell可用

 

如何切換shell呢?

檢視/etc/shells檔案裡面有多少可用的直譯器,直接輸入直譯器名稱即可,比如在命令列直接輸入ksh就能切換,如果想返回到bash(預設直譯器)直接exit即可。

其他的直譯器並沒有bash好用,所以紅帽官方選擇它當做預設的直譯器!bash有的特性是其他直譯器沒有的!

 

 


 

Bash基本特性

— 快捷鍵、Tab鍵補全

— 命令歷史

— 命令別名

— 標準輸入輸出

— 重定向

— 管道操作

 

注意:選項不要過度依賴Tab鍵(針對於7),個人認為選項能不用Tab就不要用,命令和檔案/目錄路徑可以使用。

 

命令歷史:預設記錄1000條,通過全域性變數HISTSIZE設定;(記錄最好改到100以內,每一條命令操作都會有記錄,所以任何人都可以看到,所以為了安全起見)

所有使用者生效,配置檔案:/etc/profile

命令歷史使用:!885或者!cat(最近使用cat的記錄)可以重複使用之前輸入的命令;

清空命令歷史:history -c(但是在每個使用者的家目錄裡邊還有個檔案.bash_history,歷史命令已經儲存檔案中所以要想徹底清空需要把這個檔案刪除!刪除後會自動生成!)

 

重定向輸出/輸出

標準輸入,描述號為0;

標準輸出,描述號為1;

標準錯誤,描述號為2;

&:錯誤資訊和正確資訊

>:覆蓋重定向

>>:追加重定向

輸出重定向可以理解為本來要顯示在螢幕上內容給它放到檔案中,那麼輸入重定向就是本來要通過鍵盤輸入內容直接從檔案中去讀取,檔案的內容代替了鍵盤輸入;

# mail -s dacui root < note.txt

 

管道

將一條命令的標準輸出交由另一條命令處理

 

 


 

指令碼的設計

寫指令碼的三個步驟:

1、指令碼宣告(需要的直譯器、作者資訊等)

2、註釋資訊(步驟、思路、用途、變數含義等)

   #autor:作者、郵箱

   #version:版本

   #Description:描述

3、可執行語句(操作程式碼)

Linux會按照指令碼的上下順序去執行

 

執行指令碼的方式:

1、chmod +x

2、使用絕對路徑來執行

3、bash 執行

4、source 執行

指令碼的執行一般都是開啟子程序的,但是如果使用source命令執行指令碼是不開啟子程序的;

source 在當前程序執行

例如,目前有一個指令碼名稱為a.sh,內容為sleep 100,分別使用bash a.sh    ./a.sh    /root/a.sh    source a.sh執行

使用bash a.sh    ./a.sh    /root/a.sh這三種執行都是一樣的,開啟子程序

[[email protected] sh]# pstree

bash(當前程序)─── bash(指令碼開啟的子程序)─── sleep

 

使用source a.sh結果:

[[email protected] sh]# pstree

bash(當前程序)─── sleep

 

那麼開啟子程序和不開啟子程序有什麼區別嗎?

沒有太多意義,但是有的時候會需要!比如,修改/etc/profile檔案中的HISTSIZE為20條,配置檔案修改不能立即生效,需要在新的終端才生效,此時我不想開新的終端那麼就使用source命令去執行即可;

未來90%多的指令碼都是按照正常執行,不需要考慮到開不開子程序,少數需要考慮到,特殊情況;

 


 

變數

 

set 檢視所有變數

unset 刪除變數

env 檢視系統自帶的變數

 

位置變數:

$0:指令碼名稱

$1:第一個引數

$2:第二個引數

$3:第三個引數

...

$*:列出所有引數

$#:列出引數的個數

$$:顯示指令碼的PID程序號

 

$?:檢視上一條命令的返回狀態,兩種值,0和非0

 

引號

" ":把多個內容變成一個整體;

' ':把多個內容變成一個整體,但是單引號遮蔽特殊符號,也就是說在呼叫變數的使用單引號就無法呼叫;

$():取命令的結果;

``:取命令的結果;

tar -czf xx.`date +%F`.tar /var/log

 

read

只定義變數名

-p:提示

stty -echo  不在終端顯示輸入資訊

stty echo 在終端顯示輸入資訊

 

export將區域性變數變成全域性變數