Linux Shell 程式設計基礎
什麼是shell?
在Linux核心與使用者之間的直譯器程式
— 通常指/bin/bash(預設直譯器)
— 負責向核心翻譯及傳達使用者/程式指令
—相當於作業系統的“外殼”
-
互動式 ——命令列
— 人工干預、智慧化程度高;
— 逐條解釋執行、效率低;
-
非互動式 ——指令碼
— 需要提前設計、智慧化難度大;
— 批量執行、效率高;
— 方便在後臺靜悄悄地執行;
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將區域性變數變成全域性變數