shell腳本編程 編譯器,解釋器 編程語言: 機器語言,彙編語言,高級語言 靜態語言:編譯型語言 強類型(變數) 事先轉換成可執行格式 C,C++,JAVA,C# 動態語言:解釋型語言,on the fly 弱類型 邊解釋邊執行 ASP,ASP.NET,PHP,SHELL,PYTHON,PERL ...
shell腳本編程
編譯器,解釋器
編程語言: 機器語言,彙編語言,高級語言
靜態語言:編譯型語言
強類型(變數)
事先轉換成可執行格式
C,C++,JAVA,C#
動態語言:解釋型語言,on the fly
弱類型
邊解釋邊執行
ASP,ASP.NET,PHP,SHELL,PYTHON,PERL
shell: 弱類型編程語言
強類型: 變數在使用前,必須事先聲明,甚至需要初始化
弱類型: 變數用時聲明,甚至不區分類型
bash變數類型:
環境變數:作用域為當前shell進程及其子進程
export name=value
或者name = value
export name
"導出"
腳本在執行時會啟動一個子shell進程:
命令行中啟動的腳本會繼承當前的shell環境變數
系統自動執行的腳本(非命令行啟動)就需要自我定義需要的各環境變數
本地變數(局部變數):
引用變數:${變數名},括弧可省略。變數替換 強引用 用"" 雙引號
set name=value : 作用域為整個bash進程
局部變數:
local name=value ,作用域為當前代碼段:
撤銷變數
unset name
查看當前shell 中的變數: set(查看所有變數)
查看當前shell 中得環境變數
printenv
env
export
位置變數
$1, $2....
特殊變數(系統變數)
$? : 上一個命令執行狀態返回值;
程式執行:可能有兩個狀態返回值
程式執行結果
程式返回代碼 (0-255)
0 : 正確執行
1-255:錯誤執行
1,2,127為系統預留執行返回代碼
/dev/null : 軟體設備, bit bucket , 數據黑洞
腳本:
命令的堆砌,按照實際需要,結合命令流程式控制制機制實現的源程式
shebang: 魔數
#/bin/bash 指明執行的腳本執行路徑
# 註釋行,不執行
變數追加
name=aaaa
echo $name
name=$name:bbb
echo name
完成變數的內容追加,類似數組添加元素
條件判斷:
bash中,如何實現條件判斷?
條件測試類型:
整數測試:
字元測試:
文件測試:
條件測試的表達式:
[ expression ] : []兩端必須要有空格 命令測試法
[ [expression] ] 關鍵字測試法
test expression
如:
INT1=55
INT2=65
[ $INT1 -eq INT2 ]
[ [ $INT1 -eq INT2 ] ]
test $INT1 -eq INT2
整數比較:
-eq : 是否相等 $A -eq $B
-ne : 是否不等: 不等為true,否則為false。
-gt : 大於
-lt : 小於
-ge : 大於或等於
-le : 小於或等於
命令間的邏輯關係:
邏輯與: &&
第一個條件為假時,第二條件不再判斷,最終結果已有:
第一個條件為真時,第二條件必須判斷
邏輯或: ||
編程風格——>> 變數名稱:
1 只能包含字母,數字和下劃線,並且不能以數字開頭。
2 不能跟系統中已有的環境變數重名。
3 最好見名知意
條件判斷: 控制結構
單分支if 語句:
if 判斷條件; then
statement 1
statement 2
statement 3
...
fi
雙分支if 語句:
if 判斷條件;then
statement 1
statement 2
statement 3
..
else
statement 4
statement 5
...
fi
shell中的算術運算:
A=3,B=6
1 let 算術運算表達式
let C =$A+$B
2 $[ 算術運算表達式]
C =${$A+$B}
3 $((算術運算表達式))
C = $(($A+$B))
4 expr 算術運算表達式, 表達式中各操作數及運算符之間要有空格,並且要使用命令引用
C = `expr $A + $B `
文件測試:
- e FILE(文件名或者文件路徑) : 測試文件是否存在 isexit
- f FILE : 測試文件是否為普通文件
- d FILE :測試指定路徑是否為目錄
- r FILE : 測試當前用戶對指定路線是否可讀。
- w FILE : 測試當前用戶對指定路線是否可寫。
- x FILE : 測試當前用戶對指定路線是否可執行。
[ -e /etc/inittab ]
測試腳本是否有語法錯誤
bash - n 腳本
bash - x 腳本 逐步展示執行過程
定義腳本退出狀態碼:
exit : 退出腳本(後面跟上需要的狀態碼)
如果腳本沒有明確定義退出狀態碼,那麼最後執行的一條命令的突出碼即為腳本的退出碼。
exit 0-255
bash的變數類型
本地變數(局部變數)
環境變數
位置變數:
$1,$2.... (參數位置)
shift: 參數輪替,後面跟數字,實現輪替的步進
./file.sh /etc/inittab /etc/test
$1: /etc/inittab
$2: /etc/test
特殊變數:
$? : 上一條命令的退出狀態碼
$# : 參數的個數
$* : 參數列表
$@ : 參數列表
字元測試:
==:測試是否相等,相等為真,不等為假
!=: 測試是否不等,不等為真,等為假
>
<
-n string: 測試指定字元串是否為空,空則真,不空則假
-z string: 測試指定字元串是否不空,不空為真,空則為假
#!/bin/bash # if [ $1 = 'q' ];then echo "Quiting..." exit 1 elif [ $1 = 'Q' ];then echo "Quiting..." exit 2 elif [ $1 = 'quit' ];then echo "Quiting..." exit 3 elif [ $1 = 'Quit' ];then echo "Quiting..." exit 4 else echo $1 fi
迴圈:進入條件,退出條件
for
while
until
for 變數 in 列表; do
迴圈體
done
for I in 1 2 3 4 5 6 7 8 9 10; do
加法運算
done
遍歷完成之後,退出;
如何生成列表:
{1..100}
`seq [起始數 [步進長度]] 結束數`
1,...,100
declare -i SUM=0
integer
-x
計算100以內所有奇數的和以及所有偶數的和;分別顯示之; let I=$[$I+1] SUM=$[$SUM+$I] let SUM+=$I let I+=1 相當於 let I++ -= let I-=1 相當於 let I-- ++I, --I
寫一個腳本,分別顯示當前系統上所有預設shell為bash的用戶和預設shell為/sbin/nologin的用戶,並統計各類shell下的用戶總數。顯示結果形如: BASH,3users,they are: root,redhat,gentoo NOLOGIN, 2users, they are: bin,ftp #!/bin/bash # NUMBASH=`grep "bash$" /etc/passwd | wc -l` BASHUSERS=`grep "bash$" /etc/passwd | cut -d: -f1` BASHUSERS=`echo $BASHUSERS | sed 's@[[:space:]]@,@g'` echo "BASH, $NUMBASH users, they are:" echo "$BASHUSERS
測試:
整數測試
-le
-lt
-ge
-gt
-eq
-ne
字元測試
==
!=
>
<
-n
-z
文件測試
-e
-f
-d
-r
-w
-x
if [ $# -gt 1 ]; then
組合測試條件
-a: 與關係
-o: 或關係
!: 非關係
if [ $# -gt 1 -a $# -le 3 ]
if [ $# -gt 1 ] && [ $# -le 3 ]
q, Q, quit, Quit