shell是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。shell腳本(shell script),是一種為shell編寫的腳本程序。業界所說的shell通常都是指shell腳本,但shell和shell script是兩個不同的概念。shell編程跟java、php編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了。shell腳本運行時啟動解釋器,由解釋器邊解釋邊運行,當前主流的操作系統都支持shell編程,Linux默認安裝就帶了shell解釋器。bash腳本解釋器,在centos里,/bin/sh是一個指向/bin/bash的符號鏈接;
]#ls -l /bin/sh lrwxrwxrwx. 1 root root 4 8月 2 03:38 /bin/sh -> bash
編寫腳本;打開文本編輯器,新建一個文件,擴展名為sh(sh代表shell),擴展名并不影響腳本執行,見名知意就好。
#!/bin/bash #
腳本編程文件格式
#!/bin/bash
#daecription:腳本描述
#version:版本信息
#author:作者
#date:日期
“#!”是一個約定的標記,它告訴系統這個腳本需要什么解釋器來執行。
腳本運行;給予腳本文件可執行權限,然后./腳本名稱或者直接運行bash 腳本名稱也可運行
除了頂格的shebang所有以#號開頭的行都會被忽略
變量
定義變量
定義變量時,變量名和等號之間不能有空格,變量名不加美元符號($),如:
]#youname=ali
使用變量
使用一個定義過的變量,只要在變量名前面加美元符號即可,如:
]#echo $youname ali
變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,如果不加花括號就會出現下邊情況
]#echo "the is $younamehello" the is
推薦給所有變量加上花括號,這是個好的編程習慣。
]#echo "i need ${youname}number" i need alinumber
變量可以被重復定義賦值
]#name=ali ]#echo $name ali ]#name=Aisha ]#echo $name Aisha
算術運算
有時候經常要在腳本中用到算術運算,方法很多
+,-,*,/,%,**
let VAR=expression
]#i=1 ]#j=2 ]#let sum=$i+$j ]#echo $sum 3
$[expression] 注:此算法格式中$可省略,如:
]#sum=0 ]#sum=$[i+j] ]#echo $sum 3
$((expression))
]#sum=0 ]#sum=$(($i+$j)) ]#echo $sum 3
expr argu1 argu2 argu3 注:此運算格式的運算符號需要用空格間隔開,
]#expr 10 + 10 + 10 30
有些時候乘法符號需要轉義,如
]#expr 10 \* 10 100
增強型賦值:
變量做某種算術運算后回存至此變量中;
let i=$i+#,-,*,/,%,**(個人傾向此種格式)注意;有些時候運算符號需要轉義
]#i=1 ]#let i=$i+2 ]#echo $i 3
let i+=#
]#i=1 ]#let i+=1 ]#echo $i 2
+=,-=,*=,/=,%=
自增運算:
VAR=$[$VAT+1]
let VAR+=1
let VAR++
]#i=1 ]#let i++ ]#echo $i 2
自減運算:
VAR=$[$VAT-1]
let VAR-=1
let VAR–
]#i=3 ]#let i-- ]#echo $i 2
條件測試
Linux 的Shell中存在一組測試命令,該組命令用于測試某種條件或某幾種條件是否真實存在。測試命令是判斷語句和循環語句中條件測試工具,所以,其對于編寫Shell腳本非常重要。判斷某需求是否滿足,需要有測試機制來實現;
測試結構
測試命令用于測試表達式的條件的真假。如果測試的條件為真,則返回一個0值;如果測試條件為假,將返回一個非0整數值。
測試命令有三種結構,一種是用test命令進行測試,結構如下:
test EXPRESSION;
[ EXPRESSION ]
[[ EXPRESSION ]]
其中,條件expression是一個表達式,該表達式可為數字、字符串、文本和文件屬性的比較,同時可同時加入各種算術、字符串、文本等運算符。為了提高命令的可讀性,經常使用第二種格式。
第一種
]#i=5 ]#test $i -eq 5 ]#echo $? 0
第二種
]#i=5 ]#[ $i -eq 5 ] ]#echo $? 0
第三種:此方法多用在字符測試情況下使用,因為此方法多會因為標點符號的原因報錯,不推薦使用,推薦第二種。
]#name=ali ]#[[ $name == ali ]] ]#echo $? 0
第二種方法測試字符示例
]#name=ali ]#[ $name == ali ] ]#echo $? 0
bash的測試類型
數值測試 ;數值比較
-eq:是否等于;[$num1 -eq $num2]
-ne:是否不等于;
-gt:是否大于;
-ge:是否大于等于
-lt:是否小于
-le:是否小于等于;
示例如下;注;退出狀態為0,表示num等于13;反之,退出狀態為非0.
]#num=233 ]#[ $num -eq 233 ] ]#echo $? 0
字符串測試:字符比較
==:是否等于;
>:是否大于
<:是否小于
!=:是否不等于
=~:左側的字符串是否能夠被右側的pattern所匹配
-z"string":判斷指定的字串是否為空;空則為真,不空則假
-n"string":判斷指定的字串是否不空,不空則真,空則為假;
注意:有些時候(1)字符串要加引用;(2)要使用雙中括號[[]];
示例;
]#name=ali ]#name1=Aisha ]#[[ $name == $name1 ]] ]#echo $? 1
文件測試
存在性測試(文件的存在性測試,存在則為真,否則則為假)
-a file
-e file
示例
]#touch test ]#[ -a test ] ]#echo $? 0
存在性及類型測試
-b file:是否存在并且為 塊設備文件;
-c file:是否存在并且為 字符設備文件;
-d file:是否存在并且為 目錄文件;
-f file:是否存在并且為 普通文件;
-h file或-L file:是否存在并且為符號鏈接文件;
-p file:是否存在且為 命名管道文件
-S file: 是否存在且為 套接字文件
示例;
]#[ -d /etc/ ] ]#echo $? 0
文件權限測試
-r file:是否存在并且對當前用戶可讀;
-w file:是否存在并且對當前用戶可寫;
-s file:是否存在并且對當前用戶可執行;
]#ll file ----------+ 1 root root 0 8月 21 11:15 file ]#chmod u+r file ]#ll file -r--------+ 1 root root 0 8月 21 11:15 file ~]$ [ -r /testdir/file ] [hacker@?????? ????? ~]$ echo $? 1 注:所有權限對root都形同虛設,此處普通用戶測試對此文件沒有r的權限
特殊權限測試
-g file:是否存在并且擁有sgid權限
-u file:是否存在并且擁有suid權限
-k file:是否存在并且擁有sticky權限
文件是否有內容
-s file:文件是否有內容
從屬關系;
-O file:當前用戶是否為文件的屬主
-G file:當前用戶是否屬于文件的屬組
雙目測試;
file1 -ef file2:file1與file2是否為執行同一個文件系統上的相同inode的硬鏈接
filr1 -nt file2:file1是否新于file2
file1 -ot file2:file1是否舊于file2
組合測試條件
邏輯運算符用于測試多個條件是否為真或為假,或使用邏輯非測試單個表達式,這些運算符在Shell編程中經常用到,這些條件一般和測試命令聯用。
邏輯操作符
邏輯操作 描述
!expression 如果expression為假,則測試結果為真
expression1 –a expression2 如果expression1和expression2同時為真,則測試結果為真
expression1 –o expression2 如果expression1和expression2有一個為真,則測試結果為真
其中expression為表達式,該表達式描述了一個測試條件。在邏輯運算符表達式中并不是所有的運算符都會被執行。
例:expr1 –a expr2 –a expr3
只有當expr1為真時,才會測試expr2,依次。邏輯或運算符類似。
例:[ -e file_exam –a –x file_exam ]
[ “$integer1” –lt 20 –o “integer1” –gt 30 ]
注:當邏輯非運算符和表達式之間要有空格。(此部分摘抄自網絡)
邏輯運算
第一種方式
cmd1 && cmd2
cmd1 || cmd2
!cmd
[-O FILE] && [-r FILE](測試文件是否存在并且可讀)
第二種方式
[[EXPRESSION(表達式)1 -a EXPRESSION2]]
[[EXPRESSION(表達式)1 -O EXPRESSION2]]
!EXPRESSION
[-O FILE -a -x file]
]#[ -a file -a -r file ] ]#echo $? 0
完
原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/38202