變量:
變量就是可變化的量,有名稱的記憶體空間,shell 中把變量預設為 字元型
命名規則:
1.隻能包含字母、數字和下劃線,并且不能以數字開頭
2.不能與關鍵字沖突
3.盡量做到見名知義
引号:
單引号:' 強引用
雙引号:" 弱引用 -- 可以實作變量替換 eg: echo $HOSTNAME "
反引号: ` 指令替換 <==> $(command) eg: echo " hello everone `ls /tmp`"
變量引用:
$VAR_NAME
${VAR_NAME}
set VAR_NAME=value
unset VAR_NAME
變量事先聲明:
declare [options] VAR_NAME
options: -i : ××× eg: declare -i SUM=0
-x :環境變量
-a :數組
-r :隻讀變量,值不能改變并且不能撤消
指令行展開:
~:使用者家目錄
~USERNAME : 指定使用者的家目錄
{}:類似多項式展開 eg: # mkdir -p /tmp/{lcok,date,kill/{fuck,this}}
變量的種類:
環境變量: 對目前shell及其子shell都有效
設定: declaer -x VAR_NAME=value
expore VAR_NAME=value
取消: unset VAR-NAME
顯示環境變量: export
printenv
本地變量(局部變量): 作用域為目前shell(對父shell和子shell無效)
local NAME=....
特殊變量:
$? :引用上一條指令的執行狀态傳回值
0 :成功
1-255:失敗,1 ,2,127 -->系統預留
readonly :設定隻讀變量 eg: # readmonly NAME=jerry
位置變量:
位置變量用于引用傳遞過來的參數: ${1} ,${2} ...${11}
bash如何實作指令展開:
1.切片 :以space ,tab , enter分隔(詞法分析)
2.别名替換:指令行展開 ,$ ,{} ,()
3. 可能需要重複進行1和2
4. 實作重定向: > ,>> , <
5. 執行指令
阻止展開:
轉義符:\
單引号:' '
;:分号能實作語句的分割
指令的邏輯關系:
與關系 : 雙目操作符
& :位與 0011011 01010101
&& :邏輯與 [ $A -eq 0 ] && echo "Hello body !"
或關系 : | : 位或
|| : 邏輯或
非關系 : ! 條件測試:
test expression
[ expression ] --> expression前後有空格
` expession ` -->;關鍵字
條件測試類型:
整數比較: [ ]
雙目操作: num1 操作符 num2
-eq : = eg: [ 2 -eq 3 ] ,` 2 -eq 3 `
-gt : > 大于
-lt : < 小于
-ge : >=
-le : <=
-ne : !=
字元串測試 : [[ ]] 需要用 -->雙中括号 eg: [[ string1 < string2 ]]
>
<
>=
<=
!=
==
單目:
[ -z "abc" ] :測試string是否為空,為空則真,否則為假
[ -n string ]: 為空則假,否則為真
檔案測試 :
-e /path/to : 測試檔案是否存在 eg: [ -e /etc/inittab ]
-f /path/to : 為普通檔案
-d /path/to : 測試目錄是否存在
-r :讀權限
-w :寫權限
-x :可執行權限 算術運算:
$(( expession ))
$[expression]
常用方法:
1.指派給變量
2.使用echo 回顯
SUM=$(($A+$B))
let VAR_NAME=NUM1 OP NUM2
echo VAR_NAME
expr num1 op num2
+ :
-
*
/
%
連接配接兩個條件:
-a :與關系
-o : 或關系
! : 非關系
if :
if 測試條件 ;then
statement1; ...
else
statement2;
...
fi
eg: if [ SUM -eq 0 ] ; then echo "hello world !"
else echo "No,sorry!" fi
循環執行: for
for 變量 in 清單; do
statement1
statemetn2
...
done
清單表示法:
{ } :eg -->{1..100} --> 1到100
`seq 1 100` : -->eg:偶數 `seq 2 2 100` 可以控制步進
`COMMAND` : 元素分割符是空格或換行符 eg: `ls /var`
while
while 條件 ; do
循環體
done
eg: while read LINE ;do 按行讀取檔案内容進行處理
...
done < /etc/passwd
until
until 條件 ; do
循環體
case
case 變量 in
取值1)
語句
;;
取值2)
*)
esac break :停止循環
continue:提前結束目前循環,而後進入下一次循環
RETVAL=$?
位置變量:
# ./name.sh A B C D
$0 $1 $2 $3 $4 如何與使用者互動:
read VAR_NAME
-p : " " eg: read -p "Please input your name :" NAME
-t : bash指令的選項:
-n :用于測試腳本的文法錯誤
-x :調試執行,顯示腳本調試執行過程中的詳細過程
-v 在運作 sccript 前,先将 scripts 的内容輸出到螢幕上
++ :VAR++ ,++VAR
VAR++ : 先引用 ,後自加 eg: let VAR++ <--> VAR=$[ $VAR+1 ]
++VAR : 先自加,後引用
-- : VAR-- ,--VAR
+= --> eg: let SUM+=$I <--> SUM=$(($SUM+$I))
-=
*=
/=
指定退出腳本:
狀态傳回值:0 1-->255
exit
随機數:RANDOM
輸出菜單: -->cat
# cat <<EOF
1.Please input your name:
2.Please input your telephone number:
3.Please input your address:
4.Quit
EOF function
bash 中定義函數的兩種方法:
1. function FUNC_NAME{
body
}
2. FUNC_NAME() {
body;
}
函數的傳回值:是函數調用時所執行的函數體中的最後一條語句的狀态傳回值;
自定義函數傳回值: return #