最近公司工作量很小,就複習複習,看起了馬哥的視頻,感覺馬哥講課講得特別細。這纔是深入到系統的講解,補充了很多我之前只是瞭解到皮毛的東西。
shell編程:弱類型編程語言
強:變量在使用前,必須事先聲明,甚至還需要初始化
NULL:
弱:變量用時聲明,甚至不區分類型:
變量賦值:VAR_NAME=VALUE
編譯器,解釋器
編程語言:機器語言、彙編語言、高級語言
靜態語言:編譯型語言
強類型(變量)
關鍵字:
事先轉換成可執行格式
C、 C++、JAVA、C#
動態語言:解釋型語言 on the fly 運行當中轉換
弱類型
ASP.NET、PHP、Shell、Python、Perl
bash:腳本解釋器,
面向過程:更適合開發小型環境
Shell,C
面向對象:更適合開發大型環境
JAVA,Python,perl,C++
變量:內存空間,命名內存空間
內存:編址的存儲單元
進程:
變量類型:事先確定數據的存儲格式和長度
變量類型:
字符
數值
整型,8bit:256
0-255,溢出 ,要存256就會溢出,容易導致緩衝區溢出,受到***
浮點型:11.23===》存儲爲1.123*10^1,0.1123*10^2
真假型
邏輯:1+1>2
邏輯運算:與、或、非、異或
1:真
0:假
與:只要有一個爲假,結果一定爲假
1&0=0
0&1=0
0&0=0
1&1=1
或:只要有一個爲真,結果一定爲真
|
非:
!真=假
!假=真
異或:
bash變量類型:
環境變量
本地變量(局部變量)
位置變量
特殊變量
本地變量:
set VARNAME=VALUE:作用域爲整個bash進程 (set可以省略)
unset VARNAME撤銷變量
查看shell中變量:
set
查看當前shell中的環境變量:
printenv
env
export
局部變量:
local VARNAME=VALUE 作用域爲當前代碼段
環境變量:作用域爲當前shell進程及其子進程
1,export VARNAME=VALUE
2,VARNAME=NAME
export VARNAME
“導出”
腳本在執行時會啓動一個子shell進程:
命令行中啓動的腳本會繼承當前shell環境變量;
系統自動執行的腳本(非命令行啓動)就需要自我定義需要各環境變量;
位置變量:
$1,$2,$3,…
特殊變量:
$?:上一個命令的執行狀態返回值;
程序執行,可能有兩類返回值:
程序執行結果
程序狀態返回代碼(0-255)
0:正確執行
1-255:錯誤執行,1,2,127系統預留
輸出重定向:
>覆蓋重定向
>>追加重定向
2>錯誤重定向
2>>錯誤輸出追加重定向
&>同時重定向 ,所有結果重定向
/dev/null:軟件設備,bit bucket,數據黑洞
bash:
引用變量:${VARNAME},括號可以省略
單引號:強引用
雙引號:弱引用
修改變量的值:
腳本:命令的堆砌,按實際需要,結合命令流程控制機制實現的源程序
linux中執行的命令是ELF類型的文件,寫的文本是ASCII類型
file /bin/ls
#!:shebang:魔數
#!/bin/bash
#註釋行,不執行
練習:寫一個腳本,完成以下任務
1, 添加5個用戶,user1,…user5
2, 每個用戶的密碼同用戶名,而且要求,添加密碼完成後不顯示passwd命令的執行結果信息;
3, 每個用戶添加完成後,都要顯示用戶某某已經成功添加;
useradd user1
echo “user1” |passwd –stdin user1&>/dev/null
echo “Add user1 successfully.”
條件判斷:
如果用戶不存在
添加用戶,給密碼並顯示添加成功;
否則
顯示如果已經存在,沒有添加;
bash中如何實現條件判斷:
條件測試類型:
整數測試
字符測試
文件測試
條件測試的表達式:
[expression ]
`expression `
testexpression
整數比較:
-eq:測試兩個整數是否相等:比如$A–eq $B
-ne:測試兩個整數是否不等:不等爲真,相等爲假;
-gt:測試一個數是否大於另一個數:大於爲真,否則爲假
-lt:測試一個數是否小於另一個數:小於爲真,否則爲假
-ge:大於或等於
-le:小於或等於
命令間的邏輯關係:
邏輯與:&&
第一個條件爲假時,第二個條件不用再判斷,最終結果已經有;
第一個條件爲真時,第二個條件必須判斷:
邏輯或:||
如果用戶user6不存在,就添加用戶user6
! id user6 && useradd user6
id user6 || useradd user6
如果/etc/inittab文件的行數大於100,就顯示好大的文件;
[ `wc –l /etc/inittab | cut –d ‘ ’ –f1` -gt100 ] && echo “Large file.”
變量名稱 :
1, 只能包含字母、數字和下劃線 ,並且不能數字開頭;
2, 不應該跟系統中已有的環境變量重名
3,最好做到見名知意
如果用戶存在,就顯示用戶已存在,否則就添加此用戶
id user1 && echo “user1 exists.”||useradd useer1
如果用戶不存在,就添加,否則就顯示其已經存在
! id user1 && useradd user1 || echo “user1 exists.”
如果用戶不存在,添加並且給密碼;否則,顯示其已經存在
! id user1 && useradd user1&& echo “user1” |passwd –stdin user1 || echo “user1 exists.”
練習:寫一個腳本,完成以下任務
1, 使用一個變量保存一個用戶名,
2, 刪除此變量中的用戶,且一併刪除其家目錄
3, 顯示“用戶刪除完成”類的信息
條件判斷,控制結構:
單分支if語句:
if 判斷條件;then
statement1
statement2
…
fi
雙分支if語句:
if 判斷條件;then
statement1
statement2
…
else
statement3
statement4
…
fi
練習:寫一個腳本
判斷當前系統上是否有用戶的默認shell爲bash;
如果有,就顯示有多少個這類用戶;否則,就顯示沒有這類用戶;
提示:“引用”一個命令的執行結果,要使用命令引用:比如:RESAULTS=`wc –l /etc/passwd | cut –d: -f1`
使用一個命令的執行狀態結果,要直接執行此命令,一定不能引用:比如: if id user1 一句中的id 命令就一定不能加引號:
如果想把一個命令的執行結果賦值給某變量,要使用命令引用,比如USERID=`id –u user1`;
如果想把一個命令的執行狀態結果保存下來,並作爲命令執行成功與否的判斷條件,則需要先執行此命令,而後引用其狀態結果,如:
id–u user1
RETVAL=$?
此句絕對不可以寫爲RETVAL=`id–u user1`
練習:寫一個腳本
判斷當前系統上是否有用戶的默認shell爲bash
如果有,就顯示其中一個的用戶名;否則,就顯示沒有這類用戶;
練習:寫一個腳本
給定一個文件,比如/etc/inittab
判斷這個文件中是否有空白行;
如果有,則顯示其空白行數;否則,顯示沒有空白行;
練習:寫一個腳本
給定一個用戶,判斷其UID與GID是否一樣
如果一樣,就顯示此用戶爲“goodguy”;否則,就顯示此用戶爲“bad guy”.
#!/bin/bash
USERNAME=user1
USERID=`id –u $USERNAME`
GROUPID=`id –g $USERNAME`
if [ $USERID –eq $GROUPID ];then
echo“Good guy.”
else
echo“Bad guy.”
fi
練習:寫一個腳本
給定一個用戶,獲取其密碼警告期限;
判斷用戶最近一次修改密碼時間距其最長使用期限是否已經小於警告期限;
提示:算術運算的方法$[$A -$B]:表示變量A的值減去變量變量B的值的結果;
如果小於,則顯示“Warning”;否則,就顯示“OK”。
練習:寫一個腳本
判定命令歷史中歷史命令的總條目是否大於1000,;如果大於,則顯示“Some command will gone.”;否則顯示“OK”.
shell中如何進行算術運算:
A=3
B=6
1,let:明確表示做算術
let 算術運算表達式
letC=$A+$B
2,$[算術運算表達式]
C=$[$A+$B]
3,$((算術運算表達式))
C=$(($A+$B))
4, expr 算術運算表達式,表達式中各操作數與運算符直接要有空格,而且要使用命令引用
C=`expr $A + $B`
exit # :退出腳本
測試方法:
[ expression ] 命令測試法
` expression ` 關鍵字測試法
test expression test測試法
bash中常用的條件測試有三種:
整數測試:
-gt
-le
-ne
-eq
-ge
-lt
INT1=63
INT2=77
[ $INT1 –eq $INT2 ]
[[ $INT1 –eq $INT2 ]]
test $INT1 –eq $INT2
只有在判斷比較時才使用中括號,其他不用中括號