shell這門指令碼語言
shell的意思是:殼,作為作業系統核心的外殼。
在Linux系統下,使用者不能直接操作核心,而是通過shell來操作核心的,簡單說shell就是內建了Linux指令的指令碼檔案。
一、shell變數
1、變數分類
(1)本地變數:
簡單說就是某一個shell指令碼中自己定義的變數,只能在該指令碼中使用。
(2)環境變數:
說明:
相對於整個作業系統而言的變數,類似window的環境變數。一旦配置在整個作業系統的任意位置都能檢視和使用。
使用:
檢視所有的環境變數:終端直接輸入env回車即可
檢視指定的環境變數:echo $變數名
比如:
檢視PATH環境變數:echo $PATH
(3)配置環境變數:一般都是針對檔案
方法一:export PATH=$PATH:檔案目錄
方法二:PATH=$PATH:檔案目錄
可以給安裝的軟體配置環境變數,使用起來會比較方便
$PATH:獲取當前PATH環境變數的值,目的是為了在不改變之前的配置的情況下在其後進行追加
注意:在windows下環境變數是用分號隔開的,在Linux中用的是冒號。以上兩種方法直接在終端配置是一次性配置,想要永久生效需要在配置檔案中進行配置,不同的發行版配置檔名稱不一致。
(4)Ubuntu:
系統配置檔案:/etc/profile
使用者配置檔案:~/.profile或者~/.bashrc或者~/.bash_profile
其實系統配置檔案中有指定使用者配置檔案,不確定配置那個使用者配置檔案可以按系統配置檔案中指定的來(最好)。將以上兩種方法按自己需求寫到系統配置檔案或者使用者配置檔案任意一箇中即可。
注意:系統配置檔案需要重啟系統,使用者配置檔案需要重啟終端。不想重啟也可以直接在終端輸入:source 配置檔案
系統配置檔案和使用者配置檔案的區別:
很明顯一個是針對整個系統一個是針對某個使用者,即:作用範圍不同。可以根據自己需求進行配置
2、變數的使用和定義
注意:要在後綴為.sh的shell指令碼檔案中
定義:a=值
比如:username=‘張三’
注意:變數定義等號兩邊一定不能有空格
列印變數:echo $變數名
比如:echo $a或者echo ${a}
注意:shell指令碼中變數的值要通過$獲取,第二種可以用來做字串的拼接,將變數和字串進行拼接
銷燬變數:unset 變數名
比如:unset a
宣告常量:readonly username='張三'
注意:只讀常量不可修改
二、資料型別
1、字串型別
(1)字串定義
單引號:單引號中的字串以原樣輸出。
雙引號:雙引號中的字串如果帶有特殊字元會被解析
特殊字元:$、*、&、|、``、^、\等
反引號``:會被當作命令來執行
比如:echo `date`
(2)字串的使用
獲取字串長度:${#變數名}
類似切片獲取字元:${變數名:下標:個數}
比如從字串a的下標2開始獲取2個字元:${a:2:2}
2、陣列型別
定義:a=(1 2 3)
獲取:${a[下標]}
個數統計:${#a[@]}
所有元素:${a[*]}
注意:需要配合echo才能顯示資料,echo是標準輸出的關鍵字
seq:生成一個指定的連續整數的佇列
比如生成2到10的連續整數:seq 2 10
expr:express表示式的縮寫,很明顯就是用來執行表示式的
比如:
expr 2 + 3 加法運算
echo `expr 3 + 5`
expr 3 \* 5 *號需要轉義
注意:數字和運算子之間一定要有空格,否則會被當成字串
三、運算子
1、數值運算子
-lt:小於
-le:小於等於
-gt:大於
-ge:大於等於
-eq:等於
-ne:不等於
2、字串判斷
=:等於
!=:不等於
-z:字串的長度為0
-n:字串長度不為0
3檔案判斷
-f:是否是普通檔案
-b:是否是塊裝置檔案
-c:是否是字元檔案
-d:是否是目錄檔案
-w:是否可寫
-x:是否可執行
-s:是否存在
4、邏輯運算
-a:邏輯與
-o:邏輯或
!:邏輯非
&&:邏輯與
||:邏輯或
-a和&&的區別:-a連線一個範圍中的多個表示式,&&用來連線多個範圍的不同表示式
-o和||的區別:同上,簡單說就是&&和||不能寫在範圍[]中,同樣-a和-o不能寫在範圍外
比如:
if [ 1 -lt 0 ] || [ 1 -lt 2 -o 2 -lt 3 -a 4 -gt 3 ];then
echo '邏輯或:||'
fi
四、分支結構
1、if-elif-else:
#方式一
if test 1 -lt 2;then
echo '1<2'
fi
#方式二,注意[]前後必須要有空格
if [ 3 -gt 2 ];then
echo '3>2'
fi
if [ 2 -eq 2 ];then
echo '='
fi
if [ 2=2 ];then
echo '-eq'
fi
注意:其中if和elif是一個範圍,elif和else或elif是一個範圍,最後else和fi是一個範圍。
2、case:
read -p '請輸入一個字元:' ch
case $ch in
[0-9])
echo '你輸入了一個數字'
;;
[a-z])
echo '你輸入了一個字母'
;;
*)
echo '你輸入了一個非字母和數字的字元'
;;
esac
read -p:用來在終端提醒輸入的。
[0-9]:數字0到9
[a-z]:字母a到z和字母A到Z
*):代表其他
;;:小範圍
esac:大範圍,case的倒寫
注意:格式固定,其中判斷條件也可以這樣[0-9a-z],類似正則表示式,其他沒測。
五、迴圈結構
1、for-in
#第一種
for x in ${a[*]}
do
echo 資料:${x}
done
#第二種
for x in `eq 10`
do
echo 資料:${x}
done
do和done:程式碼的範圍
2、for迴圈和continue、break的使用
for ((i=0;i<${#a[@]};i++))
do
if [ $i -eq 1 ];then
echo '下標到1停止本次迴圈'
continue
elif [ $i -eq 3 ];then
echo '下標到3停止向下迴圈'
break
fi
echo 下標為$i的資料:${a[$i]}
done
3、while
#方式一
i=0
sum=0
while [ $i -lt 5 ]
do
((sum+=i))
((i++))
echo $sum
done
#方式二
j=0
sum2=0
while [ $j -lt 3 ]
do
let sum2+=j
let j++
echo $sum2
done
#方式三
x=0
sum=0
while [ $x -lt 3 ]
do
sum=$[$sum+$x]
x=$[$x+1]
echo $sum
done
4、until:條件成立結束迴圈
i=0
until [ $i -gt 3 ]
do
echo $i
((i++))
done
六、函式使用
#函式的使用
demo(){
echo $1
return 150
}
#向檔案傳值
echo $1
#向函式傳值
demo 1
#返回值,這個有點不穩定或者說不太好用
echo $?
$0:獲取檔名
$1:獲取第一個引數,其他數值依此類推,比如$2、$3等
$*:獲取所有的引數
$#:引數的個數
$?:在終端是上一次命令執行的情況,0:代表成功,其他數字:代表失敗;在函式中可以用來獲取返回值
函式呼叫:方法名 引數