shell編程php
編程語言:機器語言 、彙編語言、高級語言java
高級語言python
靜態語言:編譯型語言c++
不須要藉助額外的二進制程序,能夠直接寫代碼shell
屬於強類型的語言(變量)編程
事先轉換成可執行格式,不須要解釋器,本身就能夠完成程序c#
屬於靜態語言的: C C++ java c#bash
問題就是容易出bug,由於是所有完成之後執行,沒有校對,一旦出問題很難排查less
動態語言:解釋型語言編程語言
弱類型的語言:
不須要直接轉換有編譯器 ,邊解釋邊執行
Asp php shell python perl
Bash:腳本解釋器
面向過程:就是分析出解決問題所須要的步驟,而後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就能夠了。
面向對象:是把構成問題事務分解成各個對象,創建對象的目的不是爲了完成一個步驟,而是爲了描敘某個事物在整個解決問題的步驟中的行爲。適合開發大型應用程序
例如五子棋,面向過程的設計思路就是首先分析問題的步驟:一、開始遊戲,二、黑子先走,三、繪製畫面,四、判斷輸贏,五、輪到白子,六、繪製畫面,七、判斷輸贏,八、返回步驟2,九、輸出最後結果。把上面每一個步驟用分別的函數來實現,問題就解決了。
而面向對象的設計則是從另外的思路來解決問題。整個五子棋能夠分爲 一、黑白雙方,這兩方的行爲是如出一轍的,二、棋盤系統,負責繪製畫面,三、規則系統,負責斷定諸如犯規、輸贏等。第一類對象(玩家對象)負責接受用戶輸入,並告知第二類對象(棋盤對象)棋子佈局的變化,棋盤對象接收到了棋子的i變化就要負責在屏幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行斷定。
能夠明顯地看出,面向對象是以功能來劃分問題,而不是步驟。一樣是繪製棋局,這樣的行爲在面向過程的設計中分散在了總多步驟中,極可能出現不一樣的繪製版本,由於一般設計人員會考慮到實際狀況進行各類各樣的簡化。而面向對象的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一。
面向過程的語言:shell c語言
面向對象:java徹底面對對象 python c++
變量:被命名的內存空間
內存:編址的存儲單元
內存在存儲數據時,都會給數據編上地址方便使用時查找,雖然都是存儲可是內存讀取寫入的的速度要比硬盤快太多了 內存做爲一個短暫存儲快速與cpu配合工做 而後把數據在存儲在硬盤裏
變量也是區分類型的,由於內存存儲 一個字符和一個數值所用的空間徹底不同,一個字符佔用7bit,可是一個字節最小是8bit 字符10就要佔用16bit空間 而數值的10 二進制轉換爲1010 才佔用4位 ,那麼內存怎麼用不一樣的方法給予變量空間 所以產生了不一樣類型的變量,以最合適的方法佔用內存空間
變量類型:肯定數據類型的存儲格式和存儲長度
不一樣的格式佔用的內存存儲空間不同
變量類型常見的分爲
字符型:
數值型:
整數型
浮點型:帶小數點後面精度的 例如11.23 21.43 都是帶小數的
日期時間型:最後仍是會轉換爲字符或者數值型來進行存儲
布爾型:真、假型 又稱邏輯類型
例1+1>2 判斷類型結果是對仍是錯 若是是對就保存爲真 不過是錯就保存爲假,那麼如何表示真假呢 那有不少方法 能夠用yes和no 也能夠用計算機0或1表示
除了算數運算還有邏輯運算
邏輯運算三種:與、或、非
「!」(邏輯非)、「&&」(邏輯與)、「||」(邏輯或)是三種邏輯運算符。
「邏輯與」至關於生活中說的「而且」,就是兩個條件都同時成立的狀況下「邏輯與」的運算結果才爲「真」。
邏輯與:只要有一個爲假,那麼結果必定爲假
簡單來說就是 必須知足全部條件 才能執行
「邏輯或」至關於生活中的「或者」,當兩個條件中有任一個條件知足,「邏輯或」的運算結果就爲「真」
邏輯或:只要其中一個爲真,那麼結果就爲真
或簡單來講 就是知足其中一個條件 一個條件就能夠執行
邏輯非:取反
!真1=假0 取它的反向數值 若是是正確使用非之後就是錯的
編譯型語言,沒有額外的處理邏輯,因此都是強類型
腳本型語言 可有有解釋器來控制,因此能夠是弱類型
Shell:弱類型編程語言
強類型:變量在使用前,必需要實現聲明,甚至還須要初始化 通常初始化爲0
0不是空
真正的空表示爲null:什麼都沒有
變量在存數據以前,必須先告訴程序,我有變量要用,這個變量是什麼類型的
弱類型:變量直接用不須要聲明 變量用時聲明,甚至不區分類型
變量賦值:變量名=賦予的值 賦予的值會保存在這個變量名稱所對應的存儲空間裏
Linux內置環境變量,這樣能夠簡化命令使用,要否則外置命令所有都以全路徑操做會很是麻煩
(1)變量:變量其實就是內存,並且是進程的變量 命名的內存空間。我在內存劃出一部分空間而後命名,我就能夠向起名的內存空間放數據,放數據的過程就變量賦值
Name=jay 在內存中找一部分空間起名叫name而空間中放的數據叫jay =就叫賦值,至關於一個抽屜 抽屜名字叫name 抽屜裏的書叫jay
命令行中啓動的腳本會繼承當前shell中的環境變量
系統自行執行的腳本
$:引用變量${變量名} 花括號能夠省略 可是若是形成名稱混淆的那麼必須加花括號
例 name=s
Echo‘你 是 大 傻 $」nameb」
這樣就必須加 {} 花括號 由於系統會把nameb當成一個 變量名 因此${name}b就能夠顯示出來了
在複習一個知識點
‘’: 強引用 不作變量替換的 echo輸出什麼就是什麼
「」:弱引用 內部的變量會替換
特殊變量
$?:保存上一個命令的執行狀態返回值
程序執行之後可能有兩類返回值
1 程序執行結果
2 程序執行狀態返回代碼(0-255)
0表示正確執行
1-255 表示錯誤執行 一、二、127系統預留
可有這麼使用 ls /var
而後$?
若是現實0那麼表示執行正確 其他1-255都表示錯誤
/dev/null 軟件設備 又稱數據黑洞 輸入的任何數值都會被吞下去而且再也找不回來,相似於一個垃圾站, 若是把數據 用>> >追加在裏頭那麼數據就會直接消失 之後會用到
set :查看當前shell中的變量
env:查看當前shell中的環境變量
export也能夠
腳本:其實就是程序的源代碼,命令的堆砌,按實際需求,結合命令流程控制機制,實現的源程序
Bash如何實現條件測試判斷?
條件測試類型:
整數測試:2是否是等於3
字符串測試:某一段所保存的數字 是否是a b c d
文件測試:判斷文件是否是存在
條件測試的表達式,如何定義條件測試
[ 表達式 ]
注意: 表達式兩邊必須有空格 不然就是語法錯誤
[[ 表達式 ]]
test 表達式
格式 if [ 表達式1 –eq 表達式2 ]
整數比較:
-eq 等於 equal 一口:測試兩個整數是否相等 好比 [ $a –eq $b ] 相等爲真 不等爲
假
-ne 不等於 no equal no 一口:測試兩個整數是否不等 不等爲真 相等爲假
-gt 大於 greater than 格瑞特 贊 :測試一個數是否大於另外一個數 大於爲真 不然爲假 有多是小於或者等於
-lt 小於 less than 蘭斯 贊 : 測試一數是否小於另外一個數 小於爲真 不然爲假
-ge 大於或等於
-le 小於或等於
文件表達式
-e:測試文件是否存在,若是存在則爲真
-d 目錄:後面跟目錄路徑 測試是不是目錄,則爲真
-f 文件: 後面跟上文件路徑 測試文件是否爲普通文件
-r :測試指定文件,對當前用戶來說 執行腳本的用戶 測試當前用戶對指定文件是否有寫權限
-x:測試指定文件,對當前用戶來說 執行腳本的用戶 測試當前用戶對指定文件是否有執行權限
-w:測試指定文件,對當前用戶來說 執行腳本的用戶 測試當前用戶對指定文件是否有寫權限
邏輯與:&&
第一個條件爲假 ,第二個條件就不用判斷 ,結果就是爲假
若是第一個條件爲真,第二個條件必需要判斷
至關於並聯電路 只要有一個開關壞了 那麼總體燈就不亮,因此就沒必要再去判斷第二個開關是否爲好
邏輯或:||
不管第一個條件爲真或者爲假,都會去判斷第二個條件 兩個都爲假結果就爲假
至關於串聯 第一個壞不影響電路,因此第一爲假 仍是會去判斷第二個條件,若是兩個都爲假,那麼結果才爲假
邏輯非 !
取反
若是邏輯與第一個條件爲假 不存在 那麼就不會去判斷第二個條件了 ,因此在條件前頭加上邏輯非 取反 讓第一個條件僞裝爲真,爲真邏輯與纔回去判斷第二個條件
例若是用戶不存在 那麼就添加用戶
! id –a wuxiaolei && userada wuxiaolei
第一個條件 id –a 查詢沒有wuxiaol這個用戶 那麼邏輯與就不會去判斷第二個條件了,因此前頭加邏輯非! 讓第一個條件僞裝爲真,第一個條件爲真了那麼邏輯與纔回去判斷第二個條件
變量名稱命名規則:只能包含字母、數字和下劃線,而且不能以數字爲開頭命名,不該該以系統現有的變量重名,不要習慣性的在變量後面加空格 例如w= wc-l 加空格是不容許的
條件判斷控制結構
1. 單分支的if 語句
使用方法以下
if 條件判斷 若是條件爲真
then 則 執行下面的語句
執行 語句1
執行 語句2
……
fi
``:命令引用 這種引用的命令的執行結果,不然用得少命令的狀態結果 就是0爲真剩餘爲假的這種結果
雙分支的if語句
If 指定判斷條件 若是條件爲真
then 則執行
執行語句1
執行語句2
…….
else 不然執行
執行語句 3
執行語句4
……..
fi
判斷條件能夠說整數比較,也能夠某個狀態返回值
多分支if語句
if 判斷條件1 若是條件爲真知足
則 then
執行 語句1
語句2
若是條件爲假 不知足 那麼
elif 那麼判斷
then
語句3
語句4 若是知足就到此爲止裏 ,若是還不知足就繼續往下斷定
elfi 那麼判斷
語句5
語句6
else 不然執行
語句7
語句8
If 結束
Shell中如何進行算數運算
A=3
B=4
C=$[$A+$B]
echo $C
7
(2)變量生成的過程就是申請內存使用的過程
本地變量:變量名=賦予數值便可 做用域爲整個bash進程均可以使用
局部變量 local 變量名=賦予數值 做用域爲當前代碼段有效
Bash:變量是進程的變量,一但進程結束那麼變量就會消失
環境變量:做用域爲當前shell進程以及子進程。其他的與本地變量差很少
export 變量名=賦予數值
腳本在執行時,會啓動一個子shell進程
位置變量:$1 ,$2 , …….
命令的組成部分
命令 選項 參數 這種格式
選項:修正命令執行特性
參數:命令的做用對象
位置變量就能夠代替參數 好比說 cat /etc/inittab /etc/passwd / /etc/123.txt
命令 參數
那麼位置變量就能夠代替參數
讓咱們來看看實例 寫個腳本 命名爲d.sh
#!/bin/bash
#
fi [ -d $1 $2]
echo 「是目錄」
else
echo 「不是目錄」
fi
執行後
./d.sh /etc/init.tab /etc/passwd
就會顯示是否爲目錄
由於 $1 $2 分別代替了命令的參數選項
這種很是靈活
$1:此處代替了 /etc/init.tab
$2:此處代替了 /etc/passwd
特殊變量
$?:執行命令狀態返回值
$#: 利用echo 加$# 能夠查看參數的個數
好比
./d.sh /etc/init.tab /etc/passwd
在腳本最上頭加上
echo $#
那麼執行完腳本
屏幕輸出會出現2
就證實 有2個參數