Linux shell指令碼筆記
shell 命令直譯器 是用來解釋使用者對系統的操作 使用 cat /etc/shells 可以檢視 系統安裝的shell
Linux 啟動過程: BIOS -> MBR -> BootLoader(grub) -> kernel -> systemd -> 系統初始化 -> shell
BIOS 基本輸入輸出系統 選擇U盤啟動還是硬碟啟動;MBR 硬盤裡可引導的部分;BootLoader(grub) 啟動核心工具 選擇啟動的核心;
kernel 啟動核心;systemd 1號程序 其餘所有程序派生於它;然後才是系統初始化 啟動shell
執行指令碼的四種方式
1 bash ./filename.sh 2 ./filename.sh
3souce ./filename.sh 4 . ./filename.sh
1和2 執行指令碼時 會建立一個新的程序來執行 3和4執行指令碼時會用當前程序來執行(環境變數是當前系統的環境變數) (不產生新程序執行的命令叫做內建命令
1 3 4 執行指令碼時指令碼可以不擁有執行許可權 2 執行指令碼時必須有可執行許可權
管道 '|' 兩個程序之間的通訊 第一個程序的輸出當作第二個程序的輸入 a|b|c a的輸出當作b的輸入 b的輸出當作c的輸入 (管道應該規避內建命令
重定向 更改標準輸入和標準輸出為檔案 利用檔案代替鍵盤的輸入 儲存至檔案代替終端的輸出
< 輸入 wc -l < /etc/passwd 將<右側的內容代替鍵盤輸入
> 輸出 覆蓋輸出 >> 追加輸出
2>> 錯誤輸出重定向 2 為標準錯誤流重定向
&>> 正確或錯誤都重定向輸出
變數 shell指令碼中可以有變數 變數名由字母 數字 下劃線組成 數字不能在變數名開始處
shell 變數為弱型別 不區分型別 區分大小寫
使用方式 1name=value 等號左右不能有空格 2 read name 從使用者處讀入變數 互動式輸入 3 name=ls 變數的值還可以是命令
4 name=$(ls /etc/) 變數的值還可以是命令的字串 $() 可以用``反引號代替 5let a=2 let關鍵字也可賦值
6 變數的值有特殊字元時應該用" 或者'包起來 這時候不應該使用let 使用'單引號包裹的內容不會解析變數 會被當作字串輸出
變數引用 ${} 大括號{}可以省略 當使用字串拼接時 也就是要把變數的值加上其他字串 這時候{}不能省略
變數作用範圍 預設作用於當前執行的shell本身 若想讓作用於子shell 時 需要用export 匯出一個變數 變數不再使用時 可以用unset刪除變數
環境變數 環境變數是當前使用者統一配置的 當前使用者下每個shell都可以得到的變數 使用env set可以檢視當前環境變數
常用環境變數 $PATH 為命令搜尋路徑 $USER 使用者名稱 $UID 使用者id $PSI 配置終端提示顯示
預定義變數 $? 儲存上一條命令執行結果 0為正確 1為錯誤 $$ 當前程序PID $0當前程序名
位置變數 $0 $1 ... $9 執行指令碼時的引數 不存在為空 (${2-_} 如果$2為空代表_ 不空代表$2
環境變數配置檔案 /etc/profile /etc/bashrc ~/.bashrc ~/.bash_bashrc /etc/profile.d/
/etc/目錄下對所有使用者生效 ~/目錄下對當前使用者生效
執行 su - root 時 配置檔案執行順序 /etc/profile ~/.bash_bashrc ~/.bashrc /etc/bashrc 有相同變數名時後面會覆蓋前面的
執行su root 時 執行~/.bashrc 和 /etc/bashrc
陣列的使用
IPTS=(1 2 3) 定義陣列 值之間用空格分開IPTS=(1 2 3)
echo ${IPTS[@]} 顯示所有元素
echo ${#IPTS[@]} 顯示元素個數
echo ${IPTS[0]} 顯示第0個