shell腳本編程
shell ---> 解析器:sh csh ksh bash
shell命令 ---> shell解析的命令
shell腳本 --> shell命令的有序集合
shell腳本編程:
????????將shell命令結合按照一定邏輯集合到一起,寫到一個 .sh 文件,去實現一個或多個功能,這個腳本文件不用編譯可以直接執行
解釋型:腳本、python
編譯型:c、c++、java、匯編語言
寫一個shell腳本文件的步驟:
創建一個腳本文件
????????touch xxx.sh
編輯腳本內容
????????vi xxx.sh 或者 code xxx.sh
執行腳本文件
? ? ? ? 1)chmod 777 xxx.sh? ? ./xxx.sh
? ? ? ? 2)bash 文件名
shell變量
shell中允許建立變量存儲數據,但是不支持數據類型(如:整型、字符、浮點類型),所有賦值給變量的值都解釋為一串字符。
變量的定義格式:? 變量名=值(等號兩邊都不能有空格)
取變量的值:$變量名
變量的分類
系統環境變量
系統配置好的,內置的變量
env 或者 printenv:查看環境變量
臨時修改:export 變量名=值
永久生效:只需要將這個命令放到家目錄下的 .bashrc 中,當前用戶有效
自定義變量
變量的格式
變量名=值
變量名='值'
變量名="值"
=兩側不能有空格
'' 內不能使用$展開變量的值
修飾變量的關鍵字:
unset:清空變量的值,不能清空readonly修飾的變量
readonly:只讀變量,值不能修改
位置變量和命令行參數
$0 ---> 執行腳本名
$1 $2 $3 ... $9
${n} ---> n:大于等于10的數:如 ${10}
$# ---> 獲取所有外部參數的個數(不包含腳本名)
$* 或者 $@ ---> 獲取所有外部參數(不包含腳本名)
預定義變量
$? 獲取的是上一條命令是否是正確的執行結果
0:為真 非0:為假
$$ 獲取當前腳本的進程ID
shell中的語句
說明性語句
????????以 # 號開始到該行結束,不被解釋執行
????????#!/bin/bash 告訴操作系統使用哪一種解析器執行的腳本文件
功能性語句
????????任意的shell命令、用戶程序或其它shell程序
結構性語句
????????條件測試語句、多路分支語句、循環語句、循環控制語句
功能性語句
1.read(類似C語言中scanf)
?????????從終端獲取值賦值給變量
????????格式 read 變量1 變量2
????????加提示語句:read -p "提示語句" 變量1 變量2
補充:
read -s 變量 ---> 輸入的信息不回顯
read -t 秒數 變量 ---> 如果用戶n秒不輸入,就結束輸入向后執行語句
read -n 個數 變量名 ---> 如果輸入n個字符,自動停止
shell中的運算
shell本身不擅長運算,需要借助于運算符和其他的指令
2.1. expr
使用方法:
- expr中使用變量,必須加$
- 如果想要接收expr的結果,必須使用命令置換符
- expr中運算符兩側必須有空格 、不支持自增和shell中的冪運算
- expr中使用某些運算符是,需要轉義 |、>、<...
- expr指令的結果,直接回顯到終端上,可以使用命令置換符接收
2.2. let
使用方法:
- let 變量名=表達式
- let運算時,運算符兩側不能有空格
- let中使用變量時,可以加$也可以不加
- 如果直接寫成 let 表達式,表達式會運行,但是沒有辦法接收
3.test
test語句可以測試三種對象
字符串 整數 文件屬性
3.1. 字符串測試
s1 = s2 測試兩個字符串是否相等
s1 != s2 測試兩個字符串是否不相等
-z s1 測試字符串是否為空
-n s1 測試字符串是否不為空
3.2. 整數測試
a -eq b 測試a和b相等 equal
a -ne b 測試a和b不相等 not equal
a -gt b 測試a大于b greater than
a -ge b 測試a大于等于b greater equal than
a -lt b 測試a小于b less than
a -le b 測試a小于等于b less equal than
3.3. 文件屬性測試
-d file 測試file是否為一個目錄
-f file 測試file是否是一個普通文件
-e file 測試file是否存在
結構性語句
if .. then .. fi
基本結構
if 表達式
then命令表
fi
分層結構
if 表達式
then命令表1
else命令表2
fi
嵌套結構
if 表達式
thenif 表達式then
命令表else
命令表fi
else
命令表
fi
elif
if 表達式1
then命令表1
elif 表達式2
then命令表2
...
else命令表n
fi
注意:
如果表達式為真, 則執行命令表中的命令; 否則退出if語句,
即執行fi后面的語句。
if和fi是條件語句的語句括號, 必須成對使用;
命令表中的命令可以是一條, 也可以是若干條。
補充操作符:
-o 或運算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true
-a 與運算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false
! 非運算 例如 [ ! false ] 返回 true
&& 邏輯與 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 邏輯或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true
| 位或 例如 echo $[2|2]
&位與 例如 echo $[2&1]
case語句
工作方式:
取值后面必須為關鍵字 in ,每一個模式必須以右括號結束。
取值可以為變量或者常量,取值檢測匹配的每一個模式 一旦模式匹配,其間所有命令開始執行直至 ;;
執行完匹配模式相應的命令不會再繼續匹配其他的模式
如果無一匹配模式,使用 * 號捕獲該值
for循環
for語句的幾種書寫格式
1.for i in 1 2 3 4 5 do .. done:變量i從單詞表中取
for i in 1 2 3 4 5
do語句塊
done
2.for i? do .. done:變量i從命令行中取值,可以省略in 單詞表
for in
do語句塊
done
3.for i in {1..10} do .. done
for i in {1..10}
do語句塊
done
4.for (( i = 1; i <= 10; i++ )) do .. done
for ((i=1;i<10; i++))
do語句塊
done
while循環
while 命令或表達式
do命令表
done
循環控制語句
break n :結束n層循環
continue n :跳過n層的本次循環