Linux為高效管理系統,提供了CLI命令行接口,供用戶在命令提示符下輸入命令,它有很多bash shell基礎特,根據這些特性能夠很靈活的使用命令,也支持使同時輸入多個命令執行,命令之間用冒號分隔;但是要完成復雜多次重復性的操作,非常不便,系統管理工作變得很是繁忙,很難輕松完成工作任務;不過Linux的shell支持腳本編程,通過編寫純文本格式的腳本,執行起來很是滿足自動化要求;不過要想使用它,必須合理規范編寫它,現在Linux系統默認的shell類型基本都是bash shell,所以學習bash shell腳本編程很是實用;
*章節
1)編程基礎
2)腳本基本格式
3)變量
4)邏輯運算
5)算術運算
6)條件測試
1.編程基礎:
編程語言風格:
我們知道程序是由指令加數據兩部分組成,cpu通過指令對數據加以處理,要想編寫程序,必須有一定的編程風格,可以分為兩大類;(1)過程式:編寫以指令為中心,注重指令檢查規范,數據服務于指令;(2)對象式:編寫以數據為中心,注重對象的定義,指令服務于數據;
編程語言類型:
運行在計算機最底層的是二進制程序指令,也就是0和1,編寫龐大的0和1對于人來說太困難了,于是有了匯編語言,這種語言是跟硬件緊密結合的,需要非常熟悉了解硬件的特性,才能夠編寫出來,所有這種匯編語言還是比較低級,于是有了高級語言,這種語言對人來說還是相對比較容易理解編寫,最終執行還是需要轉換,高級語言也有不同類型,像JAVA,C++這種屬于編譯型高級語言,需要編譯器轉換成目標代碼,而shell,Perl,Python是屬于解釋型語言,需要解釋器轉換成機器代碼。
2.腳本的基本格式:
$cat test1.sh
#!/bin/bash
#
#author:root
#version:1.1
#description:the first script ;
echo "hell user ,how are you ?"
$bash -x test1.sh
hell user ,how are you ?
腳本要求:
(1)必須指明腳本的shebang;也就是腳本的第一行,必須頂格寫#!/bin/bash,指明執行腳本要用的shell類型,這里的#不是注釋,要注意;
(2)要有基本的腳本說明信息,這樣利于腳本的管理使用,一般有日期,作者是誰,描述,版本等, 注意:#開頭的行,bash shell默認不執行;
(3)復雜的代碼片段要寫代碼注釋信息;方便自己和他人后期使用;
(4)腳本中要有適當的縮進和空白行,這樣腳本內容看起來層次分明,結構清晰;
(5)在腳本中使用定義變量,需要根據實際遵循一定的命名規范;后面變量詳細說明;
執行腳本的方式:
(1)把腳本當做參數,給bash直接當做參數執行;
(2)chmod +x script 授予腳本執行權限x,使用絕對路徑或相對路徑來執行腳本;
腳本調試檢查:
(1)尤其是復雜大的腳本尤其要事先檢查腳本語法格式,避免任務執行一半的故障;解決很是麻煩;
$ bash -n /path/to/script ///檢查語法命令格式
$ bash -x /path/to/script ///調試腳本 :可以看到腳本的執行過程,初期學習,對于復雜場景分析很是實用
定義腳本退出狀態碼
exit: 退出腳本
exit #
如果腳本沒有明確定義退出狀態碼,那么,最后執行的一條命令的退出碼即為腳本的退出狀態碼;
3.變量
:變量是命名的內存空間,是一個可變化的量,定義好之后,可以在腳本中多次引用變量值,對于后期的修改和調整很是方便;
(1)變量類型:
定義了變量類型,也就決定了數據的存儲格式,變量數據范圍,變量能夠參與的運算;這里的bash shell 可分類為:
a)字符型;
b)數值型:數值由包括整數型和浮點型;
(2)注意:對于強類型語言比較說java python這些大型編程語言,對于變量的使用必須要事先聲明類型,否則語法錯誤,而對于bash shell 這種只支持腳本的弱類型編程語言,變量在使用不需要聲明,默認變量類型為字符型,默認當做字符處理;
(3)變量的命令規則:
a)首先不能使用系統定義過和系統保留字,比如說一些測試表達式的關鍵字,if,如果使用了系統變量,腳本執行是會覆蓋系統變量值,造成其他執行環境錯亂;
b)只能使用字母數字下劃線,不能以數字開頭;
c)變量能夠做到見名知意;
d)命名使用一定要有語言規范,比如說駝峰命名法,具體根據實際生產環境使用場合調整;
(4)根據變量的作用生效范圍分類:
a)局部變量:只對當前的shell腳本代碼段有效;
b)本地變量:只對當前shell進程生效,不包含子進程;
c)環境變量:對當前shell進程及其子進程都生效;
d)位置參數變量:
$1:引用的是腳本后跟的第一個參數,$2:引用的是腳本后跟的第二個參數;…${10}:表示引用的是腳本后跟的第十個參數…(注意:這里大于9以上要用花括號“{ }”);
e)特殊變量:
$?:判斷上一條命名的執行狀態結果;
$0:引用的是腳本的本身完成的路徑名;
$#:表示的參數個數;
$*:表示的是參數的集合,不過這里表示的是把所有的參數當成一個字符串整體;
$@:表示的是所有的參數,不過這里表示的是把每個參數當成一個個獨立的參數字符串;
程序執行結果
程序執行,可能有兩類返回值:程序狀態返回代碼(0-255)
0: 正確執行
1-255:錯誤執行,1,2,127系統預留
(5)變量賦值:
1.本地變量賦值:
set VARNAME=VALUE
注意:set可以省略不寫
2.環境變量賦值:
export VARNAME=VALUE
注意;也可以先賦值后設置成環境變量,方法如下
VARNAME=VALUE
export VARNAME
3.局部變量賦值:
local VARNAME=VALUE
注意可以不寫local,因為在腳本中會定義的變量,作用在局部;
4.追加賦值:
VARNAME=$VARNAME:VALUE
注意:追加變量賦值,要用冒號;
(6)查看變量:
查看shell中所有變量:
$set
查看當前shell中的環境變量:
$printenv
$env
$export
(7)撤銷變量:
$unset VARNAME ///注意這里指定變量名即可撤銷;
(8)變量引用:
$ var1=tom
$ echo "hello $var1"
hello tom
注意:在引用變量時,如果后面跟其他字符,注意用花括號“{ }”引起來,避免混亂;如下
$ var1=Tom
$ ehco "$var1and I like to read books."
I like to read books. ///這里表示引用的:是一個叫var1and的變量名,var1and 沒有賦值;
$ var1=Tom
$ ehco "${var1}and I like to read books."
Tomand I like to read books.
注意:"" 兩個雙引號表示弱引用,變量名會替換變量值; ''兩個單引號表示的是強引用,引用是不替換變量值,
$ var2=xiaoming
$ echo "hello $var2"
$ hello xiaoming
$
$ ehco 'hello $var2'
$ hello $var2
(9)“兩個反引號可以實現命令替換引用
$ whoami
xia
$ var3=`whoami`
$ echo "how are you $var3"
how are you xia
(10)只讀變量:只讀變量設定后不能再次賦值,生效范圍只在當前shell進程,不包含子進程。
設置方式:
a) readonly VARNAME=VALUE
b) declare -r VARNAME=VALUE
$ readonly xsx=xiashixiang
$ echo $xsx
xiashixiang
$ xsx=hello
-bash: xsx: readonly variable ///這里直接報錯,說只讀變量不可再次賦值;
$ unset xsx
-bash: unset: xsx: cannot unset: readonly variable ///這里也說明只讀變量不可撤銷,只能重新登錄當前shell
4.邏輯運算:
邏輯運算:與、或、非、異或
1: 真
0: 假
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
1 & 1 = 1
總結:做與運算兩者為真,結果才為真;
或:
1 & 0 = 1
1 & 1 = 1
0 & 1 = 1
0 & 0 = 0
總結:做或運算只要有一者為真,結果就為真;
非:
! 真 = 假
! 假 = 真
總結:做非判斷,取反;
異或
1 & 0 = 1
1 & 1 = 0
0 & 1 = 1
0 & 0 = 0
總結:兩者不同則為真,相同則為假;
命令的間邏輯關系:
邏輯與: &&
1.第一條命令為真時:
第二條命令為真時,才會執行;
第二條命令為假時,不會執行;
2.第-條命令為假時:
第二條命令為真時,不會看
第二條命令為假時,不會看
邏輯或: ||
1.第一條命令為真時:
第二條命令為真時,不會看
第二條命令為假時,不會看
2.第一條命令為假時:
第二條為真時,執行第二條;
第二條為假,不會執行;
5.算術運算:
bash默認對字符處理
1.基本運算符:
+ – * / ** %
注意)*:乘法符號有時在特定情境下需要轉義”/*“;
2.運算方式:遵循算術運算格式
(1)let var=算術運算表達式
(2)$[算術運算表達式]
(3)$((算術運算表達式))
(4)expr 算術運算表達式(注意算術符之間必須有空格分割)
引用var=$(expr $ARG1 $OP $ARG2)
(5)echo "options;expression"|bc
(6)下面一一列舉算術運算表達式:
$ a=100
$ b=3
$ let var3=$a+$b
$ echo $var3
103
$
$ echo $[$a+$b]
103
$
$ echo $[a+b]
103
$
$ echo $(($a+$b))
103
$
$ expr $a + $b
103
$
$ expr $a * $b
expr: syntax error ///注意這里的乘法符號沒有轉義語法報錯;
$
$ expr $a \* $b
300
$
$ var4=$(expr $a + $b)
$ echo $var4
103
6.條件測試:
根據數據類型測試可以分為如下:
(1)整數測試;
(2)字符測試;
(3)文件測試:
條件測試的表達式:
[ expression ]
[[ expression ]]
test expresion
*注意:方括號中的表達式兩邊必須有空格,否則語法錯誤如下;
#[100 -eq 100 ]
-bash: [100: command not found
1.整數測試操作符:要做整數測試,需要用到整數比較符號;
-eq :測試兩個整數是否相等;相等測為真,不等則為假;
#a=100
#b=100
#[ $a -eq $b ]
#echo $?
0
#
#b=200
#[ $a -eq $b ]
#echo $?
1
-ne:測試兩個整數是否不等,不等為真,相等為假;
#a=100
#b=200
#[ $a -ne $b ]
#echo $?
0
#
#b=100
#[ $a -ne $b ]
#echo $?
1
-gt:測試一個前一個整數是否大于后一個整數,大于為真,不大于為假;
#a=200
#b=100
#[ $a -gt $b ]
#echo $?
0
#
#a=10
#[ $a -gt $b ]
#echo $?
1
-lt:測試前一個整數是否小于后一個整數,小于為真,不小于為假;
#a=100
#b=200
#[ $a -lt $b ]
#echo $?
0
#
#a=300
#[ $a -lt $b ]
#echo $?
1
-ge:測試前一個整數是否大于或等于后一個整數,大于或等于則為真,不大于或等于則為假;
#a=100
#b=10
#[ $a -ge $b ]
echo $?
0
#b=100
#[ $a -ge $b ]
#echo $?
0
#b=200
#[ $a -ge $b ]
#echo $?
1
-le:測試前一個整數是否小于或等于后一個整數,小于或等于則為真,不小于或等于則為假;
#a=100
#b=200
#[ $a -le $b ]
#echo $?
0
#a=200
#[ $a -le $b ]
#echo $?
0
#a=300
#[ $a -le $b ]
#echo $?
1
2.字符測試操作比較符;
*注意:
(1)字符或字符串比較,需要用兩個方括號“[[ ]]”,否則就無法判斷;
(2)字符比較嚴格區分大小寫,默認根據字母逆序排大小,b大于a;同時大寫字母大于小寫字母,B大于b;相同則向下逐級比較;
== 測試兩個字符或字符竄是否相同,相同為真,不同為假;
#var5=xiaoming
#var6=xiaoming
#[[ $var5 == $var6 ]]
#echo $?
0
#var6=xiaohong
#[[ $var5 == $var6 ]]
#echo $?
1
!= 測試兩個字符或字符串是否不同,不同為真,相同為假;
#var5=aaa
#var6=bbb
#[[ $var5 != $var6 ]]
#echo $?
0
#var6=aaa
#[[ $var5 != $var6 ]]
echo $?
1
> 測試前一個字符或字符串是否大于后一個字符或字符串,大于則為真,不大于則為假;
< 測試前一個字符或字符串是否小于后一個字符或字符串,小于則為真,不小于則為假;
#var7=AAA
#var8=aaa
#[[ $var7 > $var8 ]]
# echo $?
0
#
#[[ $var7 < $var8 ]]
#echo $?
1
-n string: 測試指定字符串是否不為空,不空則真,空則假;
-z string: 測試指定字符串是否為空,不空為真,不空則為假;
#var9=xia
#[[ -n $var9 ]]
#echo $?
0
#[[ -z $var9 ]]
#echo $?
1
#var9=
#[[ -z $var9 ]]
#echo $?
0
3.文件測試:
(1)文件存在測試:
-e FILE:測試文件是否存在,存在則為真,不存在則為假;
-a FILE:等同于-e
(2)文件類別測試:
-d FILE:測試是否為目錄,目錄為真,不是目錄為假;
-f FILE:測試是否為普通文件,是普通文件則為真,不是則為假;
-p FILE:測試是否為命名管道文件,是為真,不是為假;
-h FILE:測試是否為軟連接文件,是軟連接文件則為真,不是則為假;
-L FILE:等同于-h
-S FILE:測試是否為套接字文件,是套接字文件則為真,不是則為假;
-b FILE:測試是否為塊設備文件,是塊設備文件則為真,不是則為假;
-c FILE:測試是否為字符設備文件,是字符設備文件則為真,不是則為假;
(3)空文件測試
-s FILE:測試是否為空文件,也就是文件大小為0,文件存在且為空則為真,文件有數據則為假;
(4)文件權限測試
-r FILE:測試當前用戶是否對文件有讀權限,有則為真,沒有則為假;
-w FILE:測試當前用戶是否對文件有寫權限,有則為真,沒有則為假;
-x FILE:測試當前用戶是否對文件有執行權限,有則為真,沒有則為假;
(5)文件特權權限測試:
-u FILE:測試文件是否有suid權限,有則為真,沒有則為假;
-g FILE:測試文件是否有sgid權限,有則為真,沒有則為假;
-k FILE:測試文件是否有sticky權限,有則為真,沒有則為假;
(6)文件屬主屬組測試:
-O FILE:測試當前用戶是否是文件的屬主,是為真,不是則為假;
-G FILE:測試當前用戶是否是文件的屬組,是為真,不是則為假;
(7)文件雙目測試:
FILE1 -ef FILE2 :測試兩個文件的的inode是否相同,也就是說是兩個相同的硬鏈接文件;
FILE1 -nt FILE2 :測試FILE1是否新于FILE2,也就是說FILE2是老文件,FILE1新為真,FILE2新為假;
FILE1 -ot FILE2 :測試FILE1是否舊于FILE2,FILE1新為假,舊為真;
原創文章,作者:xiashixiang,如若轉載,請注明出處:http://www.www58058.com/34717
總結的很詳細,作業需要不上來哦。