bash腳本編程:
????腳本程序:解釋器解釋執行;
???????????? 流程控制語句;
???????????????? 順序執行;
???????????? 循環執行;
???????????????? 選擇執行;
2. ????????bash變量是弱類型;默認字符型;
?
????????變量引用:${VAR_NAME}
????????引號:
????????????弱引用:" " //可以實現變量的替換
????????????強引用:' ' //不可完成變量替換
????????????命令引用: ` `
3.
????????聲明某變量為整型變量:
????????????let VAR_NAME=VALUE
????????????declare -i VAR_NAME=VALUE
如:在腳本想聲明 變量sum為整型,并且給其賦值為0
???????????????? declare -i sum=0
?
????????聲明某變量為環境變量:
????????????export VAR_NAME=VALUE
????????????declare -x VAR_NAME=VALUE
如:
????????????export -i sum=0
4. 腳本的編寫格式:
????第一行:寫明解釋器; #!/bin/bash
????注釋行:所有以#開頭的行均為注釋行;會被解釋器忽略;
?
????執行腳本:
????????賦予執行權限;指明路徑執行;
????????直接傳遞腳本給bash解釋器
?
????????bash的選項:
????????????-n: 測試腳本中是否有語法 錯誤;
????????????-x: 調試執行;
5 . 算術運算:
????????$[EXPRESSION]
????????let VAR_NAME=EXPRESSION
????????$((EXPRESSION))
????????$(expr argu1 argu2 argu3)
????5.1 例 a=1,b=2 求 a+b?
?
????第一種方法:
????????[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# echo $[a+b]
3
????????第二種方法:let 命令的用法
????????????????????格式:
????????????????????let 賦值表達式
????????????????【注】let 賦值表達式功能等同于:((賦值表達式))
????????????5.2????范例 1:給自變量 I 加5
????????????????????????[changsheng@localhost ~]$ i=2
[changsheng@localhost ~]$ let i=i+5
[changsheng@localhost ~]$ echo $i
7
==>去掉 let 定義
[changsheng@localhost ~]$ i=i+5
[changsheng@localhost ~]$ echo $i
i+5
提示: let i=i+5 等同于 ((i=1+5)),但后者效率更高
????????????5.3????范例2 :利用let計數監控web服務狀態的小項目(如果看不懂,可以跳過去,這個只是提升題)
????#########################################################################
# File Name: _server_monitor.sh
# Author: changsheng
# mail: 1210982521@QQ.com
# Created Time: Fri 05 Dec 2014 03:48:07 PM CST
#########################################################################
#!/bin/bash
#監控服務狀態
ServerMonitor(){
????#服務狀態監控
????timeout=10
????fails=0
????success=0
????while true
????do
????/usr/bin/wget --timeout=$timeout --tries-1 http://172.16.0.1/ -q -O /dev/null
????????if [ $? -ne 0 ]
????????then
????????????let fails=fails+1
????????????success=0
????????else
????????????fails=0
????????????let success=1
????????fi
????????if [ $success -ge 1 ]
????????then
????????????exit 0
????????fi
????????if [$fails -ge 2 ];then
????????????Critical=" TMS 應用服務出現故障,請緊急處理??! "
????????????echo $Critical | mutt -s " 服務 down " www.magedu.com
????????????exit
????????fi
????done
?
}
?
6. 以空格為分割,打印1-10之間的數字:
????????[root@localhost test-scripts]# seq -s " " 10
1 2 3 4 5 6 7 8 9 10
注解: -s 是指定分隔符
7. shell 的特殊變量
????如下圖所示:
????????
?
?
????????7.1 $* 和$@區別例子:
???????????????? $* 將所有的命令行的所有參數視為單個字符串,等同于"$1$2$3
???????????? $@ 將命令行的每個參數視為單獨的子串,等同于"$1" "$2" " $3".這是將參數傳遞給其它程序的最佳方式,因為他會保留所有內嵌在每個參數的任何空白。
實戰演示:
[root@localhost test-scripts]# set -- "I am" handsome boy #===》傳入三個參數
[root@localhost test-scripts]# echo $# #==è現在有三個參數
3
[root@localhost test-scripts]# for i in $*;do echo $i;done #循環打印這些參數用$*,無引號
I
am
handsome
boy
[root@localhost test-scripts]# for i in $@;do echo $i;done #沒有引號的情況下和$*結果一樣
I
am
handsome
boy
[root@localhost test-scripts]# for i ;do echo $i;done #--無in變量列表,相當于 in "$@"
I am
handsome
boy
[root@localhost test-scripts]# for i in "$@";do echo $i;done #------在有雙引號的情況下,參數里引號內內容當做是一個參數輸出了,這才是符合我們傳入參數的要求set – "I am" handsome boy .
I am
handsome
boy
[root@localhost test-scripts]# for i in "$*";do echo $i;done #--加了雙引號,$*表示一個字符串
I am handsome boy
[root@localhost test-scripts]# shift #---用shift 去掉第一個參數
[root@localhost test-scripts]# echo $#
2
[root@localhost test-scripts]# for i in "$@";do echo $i;done #--再次打印只剩后面的參數
handsome
boy
?
8.變量子串的常用操作
????我來為朋友們舉例說明:
定義changsheng變量,內容為"I am chang sheng "
[root@localhost etc]# changsheng="I am chang sheng"
[root@localhost etc]# echo ${changsheng}
I am chang sheng????
[root@localhost ~]# echo ${#changsheng}
16
?
2)截取changsheng變量字符串從第二個字符之后開始取,默認取后面字符的全部,第2個字符不包括在內。????????也可以理解為刪除前面的多少字符
[root@localhost ~]# echo ${changsheng:2}
Am chang sheng
?
?
3)截取changsheng變量字符從第二個字符之后,取兩個字符。
[root@localhost ~]# echo ${changsheng:2:2}
am
提示:類似 cut –c 參數
[root@localhost ~]# echo ${changsheng}|cut -c 1-4
I am
[root@localhost ~]# echo ${changsheng}|cut -c 3-4
am
?
?
4)從變量$changsheng開頭開始刪除最短匹配"I am " 子串
[root@localhost ~]# echo ${changsheng#I am}
Chang sheng
?
?
5)從變量$changsheng開頭開始刪除最長匹配"I am chang子串"
[root@localhost ~]# echo ${changsheng##I am chang}
Sheng
6) ????${var%Word*}: 自右而左,刪除第一次word出現處的字符開始直到尾部的所有字符;
????????????${var%%word*}:自右而左,刪除最后一次word出現處的字符開始直到尾部的所有字符;
?
系統腳本里的實例:
[ -z "${COLUMNS:-}" ] && COLUMNS=80
??
[ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="$(/sbin/consoletype)"
?
?
下面依次舉例說明:
(1)${value:-world}
當變量未定義或者為空時,返回world內容,否則返回變量的值
[root@localhost ~]# result=${test:-UNSET}
[root@localhost ~]# echo $result
UNSET
[root@localhost ~]# echo $test
[root@localhost ~]#
結論:當test變量沒有內容時,就返回了后面的UNSET。但是并沒有給 result 賦值
(2)${value:=word}
[root@localhost ~]# unset result
[root@localhost ~]# echo $result
?
?
[root@localhost ~]# unset test
[root@localhost ~]# echo $test
?
[root@localhost ~]# result=${test:=UNSET}
[root@localhost ~]# echo $result
UNSET
[root@localhost ~]# echo $test
UNSET
?
提示:變量不存在時,會給變量賦值后面的內容
?
?
9.變量替換表
13. 常用文件測試操作
?
整數二元比較操作符
?
?
?
?
?
?
多分支結構
?
?
?
?
?
?
?
?
?
函數:
?
新聞熱點
疑難解答