一、邏輯運算
變量:
本地變量、環境變量、局部變量、位置參數變量、特殊變量
變量賦值:name=value,export name=value,declare -x name=value
變量引用:$name,${name}
注意:有些時候{}不能省略,例如
echo “$valuemagedu.com”
echo “${value}magedu.com”
撤銷:unset name
bash腳本編程,運行腳本
#!/bin/bash #稱為shebang是bash腳本的默認開頭行固定格式
# # #號后面是注釋信息,不顯示也不影響腳本執行結果
空白行 忽略不顯示行
bash的配置文件
porfile類:登錄式shell
bashrc類:非登錄式shell
登錄式shell:/etc/profile–>/etc/profile.d/*.sh–>~/.bash_profile–>~/.bashrc–>/etc/bashrc
非登錄式shell:~/.bashrc–>/etc/bashrc–>/etc/profile.d/*.sh
算數運算
+,-,*,/,**(乘次方),%(求模取余)
在bash中默認數據類型都是字符串形式,做算數運行需要經特殊方法才可以
示例:
[root@localhost ~]# num1=2 [root@localhost ~]# num2=9 [root@localhost ~]# echo "${num1}+${num2}" 2+9 [root@localhost ~]# declare -i num3=5 [root@localhost ~]# declare -i num4=9 [root@localhost ~]# echo "${num3}+${num4}" 5+9
算術運算格式:
(1)let VAR=算數運算表達式
[root@localhost ~]# let ${num1}+${num2}
#默認不輸出結果到屏幕,所以需要賦值給變量,再引用
[root@localhost ~]# let sum5=${num1}+${num2} [root@localhost ~]# echo ${sum5} 11
let 參數 [參數 …]
算術運算格式含義
num++,num– (兩個減號不是大橫線)變量后遞增,后遞減
++num,–num(兩個減號不是大橫線)變量前遞增,前遞減
+,-加法、 減法
!,~ 邏輯和按位求反
** 求冪運算(乘次方)
*,/,% 乘法,除法,求模(求余)
<<,>> 左和右移位
<=,>=,<,> 比較
==、 != 平等,不平等
& 按位與
^ 按位異或
| 按位或
&& 邏輯與
|| 邏輯或
expr ?expr: expr
條件運算符
=, *=, /=, %=,+=, -=, <<=, >>=,&=,^=,|= 賦值
變量也可以作為let 命令的參數
(2)VAR=$[算數運算表達式]
但是不能直接運行,賦不賦值給變量都可以,需要命令直接引用,如echo
[root@localhost ~]# $[${num2}+${num3}] bash: 14: 未找到命令... [root@localhost ~]# echo "$[${num2}+${num3}]" 14
(3)VAR=$((算數運算表達式))
但是不能直接運行,賦不賦值給變量都可以,需要命令直接引用,如echo
[root@localhost ~]# $((${num2}+${num3})) bash: 14: 未找到命令... [root@localhost ~]# echo $((${num2}+${num3})) 14
(4)expr EXPRESSION 或 VAR=$(expr EXPRESSION)
expr OPTION
示例:
[root@localhost ~]# num1=2 [root@localhost ~]# num2=4 [root@localhost ~]# expr ${num1} + ${num2} 6 [root@localhost ~]# sum=$(expr ${num1} \* ${num2}) #注意乘法*符號需要轉意(原因是*號在有些場景中為glob通配符) [root@localhost ~]# echo "${sum}" 8
expr 參數的算術運算格式
ARG1 | ARG2
ARG1 是否為 null,也不是 0,否則為 ARG2
ARG1 & ARG2
ARG1 如果參數都不是 null 或 0,否則為 0
ARG1 < ARG2
ARG1 小于 ARG2
ARG1 <= ARG2
ARG1 小于或等于 ARG2
ARG1 = ARG2
ARG1 等于 ARG2
ARG1 != ARG2
ARG1 ARG2 不等于
ARG1 >= ARG2
ARG1 是大于或等于 ARG2
ARG1 > ARG2
ARG1 大于 ARG2
ARG1 + ARG2
ARG1 和 ARG2 的算術總和
ARG1 -ARG2
ARG1 減 ARG2 的算術差
ARG1 * ARG2
ARG1 和 ARG2 的算術積
ARG1 / ARG2
ARG1 除以 ARG2 的算術商
ARG1 % ARG2
ARG1 除以 ARG2 的算術余數
注意:算數運算格式內各參數彼此之間必須有空格,并且shell腳本不支持浮點型
增強型賦值:
變量做某種算數運算后回存至此變量中;
eg:
let i=$i+#
let i+=#
還有:+=,-=,*=,/=,%=
自增:
VAR=$[$VAR+1]
let VAR+=1
let VAR++
自減:
VAR=$[$VAR-1]
let VAR-=1
let VAR–
二、條件測試:
判斷某需求是否滿足,需要由測試機制來實現;
如何編寫測試表達式以實現所需的測試;
(1)執行命令,并利用命令狀態返回值來判斷
0:成功
1-255:失敗
(2)測試表達式
test EXPRESSION eg:test 3 -gt 2
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION兩端必須有空白字符,否則有語法錯誤
bash的測試類型:
數值測試:數值比較
-eq:是否等于; eg:[ $num1 -eq $sum2 ]
-ne:是否不等于
-gt:是否大于
-ge:是否大于等于
-lt:是否小于
-le:是否小于等于
字符串測試:
==:是否等于;(字符串)
一個=號也可以由于賦值變量用=號,但是賦值并不應用到[]中,所以能夠使用,但是還是推薦使用雙=號
>:是否大于
<:是否小于
!=:是否不等于
=~:左側字符串時候能夠被右側的PATTERN所匹配;(模糊匹配而非精確匹配)
示例:
[root@localhost ~]# [[ tom =~ tom ]] [root@localhost ~]# echo $? 0 [root@localhost ~]# [[ tom =~ om ]] [root@localhost ~]# echo $? 0 [root@localhost ~]# [[ tom =~ o ]] [root@localhost ~]# echo $? 0 [root@localhost ~]# [[ tom =~ x ]] [root@localhost ~]# echo $? 1
-z “STRING”:判斷指定的字符串是否為空,空為真,不空為假
-n “STRING”:判斷指定的字符串是否為不空,不空為真,空為假
注意:(1)字符串測試時:字符串要加引號,表示引用有變量命令””,沒有變量命令使用”
(2)作比較時,盡量使用[[]];
(3) 但是在組合測試時,[[]]有時會有語法錯誤,所以可以使用[]
示例:
[root@localhost ~]# [ var1 == var1 ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ var1 == Var1 ] [root@localhost ~]# echo $? 1 [root@localhost ~]# [ var1 == ${Var2} ] -bash: [: var1: 期待一元表達式 [root@localhost ~]# [ var1 == "${Var2}" ] [root@localhost ~]# echo $? 1 [root@localhost ~]# [ a > b] -bash: [: 缺少 `]' [root@localhost ~]# [ a > b ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ a < b ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ "a" < "b" ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ "a" > "b" ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [[ "a" > "b" ]] [root@localhost ~]# echo $? 1
文件測試:
存在性測試:
-a FILE 少使用
-e FILE 推薦使用
文件存在則為真,否則為假
存在性及類型測試:
-b FILE:是否存在并且為塊設備文件;
-c FILE:是否存在并且為字符設備文件;
-d FILE:是否存在并且為目錄文件;
-f FILE:是否存在并且為普通文件;
-h FILE 或 -L FILE:是否存在并且為符號鏈接文件;
-p FILE:是否存在并且為管道文件;
-S FILE:是否存在并且為套接字文件;
文件權限測試:
-r FILE:是否存在并且對當前用戶可讀;
-w FILE:是否存在并且對當前用戶可寫;
-x FILE:是否存在并且對當前用戶可執行;
特殊權限測試:
-u FILE:是否存在并且擁有suid權限;
-g FILE:是否存在并且擁有sgid權限;
-k FILE:是否存在并且擁有sticky權限;
注意:對于腳本則是當前運行此腳本的用戶
文件是否有內容:
-s FILE:是否有內容;
時間戳測試:
-N FILE:文件自從上一次讀取操作后是否被修改過
從屬關系測試:
-O FILE:當前用戶是否為文件的屬主;
-G FILE:當前用戶是否屬于文件的屬組;
雙目測試:
FILE 1 -ef FILE2 :FILE1與FILE2是否指向同一個文件系統的相同inode的硬鏈接;
FILE 1 -nt FILE2 :FILE1的最近一次更新時間是否新于FILE2的最近一次更新時間
FILE 1 -ot FILE2 :FILE1的最近一次更新時間是否舊于FILE2的最近一次更新時間
組合測試條件:
邏輯運算:
第一種方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
eg: [ -O FILE ] && [ -r FILE ]
第二種方式:
test EXPRESSION1 -a EXPRESSION2
[ EXPRESSION1 -a EXPRESSION2 ]
[[ EXPRESSION1 -a EXPRESSION2 ]]
類此還有
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
eg:[ -O FILE -a -r FILE ]
注意:模式匹配時,勢必要激活正則表達式引擎,而使用正則表達式的測試判斷,要比單一字符串測試判斷要慢,所以盡量避免使用正則表達式進行查找比較和測試;
腳本的狀態返回值:
默認是腳本中執行的最后一條件命令的狀態返回值
自定義狀態退出狀態碼:exit [n]:n為自己指定的狀態碼;
注意:shell進程遇到exit時,即會終止,因此,整個腳本執行即為結束;
三、bash腳本語句
過程式編程語言的代碼執行順序:
順序執行:從左至右,從上至下,逐一運行
選擇執行:代碼有一個分支:條件滿足時才會執行
兩個或以上的分支:只會執行其中一個滿足條件的分支
循環執行:
代碼片段(循環體)要執行0、1或多次重復運行
選擇執行:
單分支的if語句
if 測試條件;then
代碼分支
條件為真則執行,為假則不執行
或者
fi
if 測試條件
then
代碼分支
條件為真則執行,為假則不執行 fi
雙分支的if語句:
if 測試條件;then
條件為真時執行的分支
else
條件為假時執行的分支
fi
多分支的if語句:
if COMDITION1;then
條件1為真分支
elif COMDITION2;then
條件2為真分支
elif COMDITION3;then
條件3為真分支
…
elif COMDITIONn;then
條件n為真分支
else
所有條件均不滿足時的分支
fi
注意:即便多個條件可能同時都能滿足,分支只會執行其中一個,首先測試為“真”;并且if語句可嵌套if等其他語句
case語句的語法格式:
case $VARAIBLE in
PATH1)
分支
;;
PATH2)
分支
;;
…
*)
分支
;;
esac
注意:雙分號如果不加,則會前一個匹配執行后,下一個會接著匹配執行
適用于一個變量,與多個可能取值比較
支持glob風格的通配符:
*:任意長度的任意字符;
?:任意單個字符
[]:范圍內任意個字符
a|b:a或b;
bash腳本編程之用戶交互:
腳本參數
用戶交互:通過鍵盤輸入數據,從而完成變量賦值操作
read [option]…[name…]
-p ‘PROMPT’ 提示注釋信息
-t TIMEOUT 時間限制
bash -n /path/to/some_script
檢測腳本中的語法錯誤
bash -x /path/to/some_script
調試執行
循環執行:將一段代碼重復執行0、1或多次;
進入條件:條件滿足時才進入循環
退出條件:每一個循環都應該有退出條件,以有機會退出循環
bash腳本:
for循環
while循環
until循環
for循環:
執行機制:依次將列表中的元素賦值給“變量名” ; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束
兩種格式:
(1)遍歷列表
(2)控制變量
遍歷列表
for VARAIBLE in LIST;do
循環體
done
進入條件:LIST列表有元素,即可進入循環
退出條件:列表中的元素遍歷完成
LIST的生成方式:
(1)直接給出;
(2)整數列表
(a){start…end}
(b)seq [start [incremtal]] last
(3)返回列表的命令:$(COMMAND),例如:ls cat
(4)glob通配符
(5)變量引用;例如$@,$*
格式示例:
#!/bin/bash
#
for username in user1 user2 user3;do
if id $username &>/dev/null;then
echo “$username exists.”
else
useradd $username && echo “Add user $username finished.”
fi
done
示例:求100以內的正整數之和
#!/bin/bash
#
delcare -i sum=0
for i in {1..100};do
echo “\$sum is $sum,\$i is $i”
sum=$[$sum+$i]
done
echo $sum
示例:判斷/var/logm目錄下的每一個文件的內容類型
#!/bin/bash
#
for filename in /var/log/*;do
if [ -f $filename ];then
echo “Common file.”
elif [ -L $filename ];then
echo “Sysbolic link”
elif [ -d $filename ];then
echo “Directory.”
elif [ -b $filename ];then
echo “block special file.”
elif [ -c $filename ];then
echo “character special file.”
elif [ -S $filename ];then
echo “Socket file.”
else
echo “Unkown.”
fi
done
while循環:
while CONDITION;do
循環體
循環控制變量修正表達式
done
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環,因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
進入條件:CONDITION測試為“真”
退出條件:CONDITION測試為“假”
示例:求100以內的正整數之和
#!/bin/bash
#
declare -i sum=0
declare -i i=1
while [ $i -le 100 ];do
sum=$[$sum+$i]
let i++
done
echo $sum
原創文章,作者:cnc,如若轉載,請注明出處:http://www.www58058.com/71736