grep:支援基本正規表達式,使用?、{}、()等元字元必須使用\轉義
egrep:支援擴充正規表達式,多支援+、|等元字元,且無需轉義
fgrep:fast grep,不支援正規表達式,效率最高,消耗資源最少。
shell的程式設計特性:腳本程式設計
先看看程式設計語言的分類:
按語言等級層次分:
機器語言-->彙編語言-->進階語言
按語言特性分類:
編譯型(靜态)語言:執行前必須先編譯成可執行格式,執行時無需其他條件
強類型(變量):變量在使用前必須先聲明,甚至還需初始化
c、c++、c#、java ...
解釋型(動态)語言:邊解釋邊執行,要想執行,系統中必須包含對應的解釋器
弱類型:變量用時聲明,甚至不區分類型
php、python、perl、shell ...
按工作特性分類:
面向過程語言:c、shell、perl
面向對象語言:java、python、c++、perl
變量:一段公用的記憶體空間
記憶體:編址的存儲單元
程序:執行中的程式
變量類型:事先确定資料的存儲格式和長度
字元型:
數值:
整形
浮點型:11.23 1.123*10^1 0.123*10^2
時間:
2015.12.30:64bit
99999:24bit
linux預設把資料存儲為字元格式,以下指令不會得到想要的結果
[root@logstach tmp]# echo 2+3
2+3
可以這樣:(注意2+3之間要空格)
[root@logstach tmp]# expr 2 + 3
5
問題:為什麼要定義變量類型?
假設我們存儲10這個代碼,如果我們把它存儲成字元類型,那麼理論上7個二進制位可以完全表示ascll碼,存儲10則需要14位,但是由于計算機最小機關是位元組,是以最終占用16位。而如果存儲為數字格式的話,10轉化為二進制為1010,也就是隻要4位最終占用1個位元組就可以了。如果不加以區分,會早造成大量的空間浪費。
緩沖區溢出攻擊:
假設我們定義一個變量的存儲長度為8bit,當存儲數值為256時,此時數值超過了8bit能表示的數值,于是向前進1,這個1就是溢出的位,如果溢出的位影響到的位址空間恰好是某個關鍵性程序的記憶體空間,所造成的後果是難以想象的。
邏輯運算:與、或、非、異或
變量指派:VAL_NAME=VALUE
bash變量:
本地變量:VALNAME=VALUE 作用域為整個bash程序
局部變量:local VALNAME=VALUE 作用域為目前代碼段
環境變量:export VALNAME=VALUE 或VALNAME=VALUE ; export VALNAME
作用域為目前shell程序以及子程序
特殊變量:$?上一個指令的執行狀态傳回值
位置變量:$1、$2、....
腳本在執行時會啟動一個子shell程序
指令行中啟動的腳本會繼承目前shell的環境變量
非指令行(系統自動執行的腳本)需要自我定義各環境變量;
程式執行時,可能有兩類傳回值:
程式執行結果
程式狀态傳回代碼(0-255)
0:正确執行
1-255:錯誤執行,1,2,127系統預留
/dev/null:軟體裝置,bit bucket,資料黑洞,任何輸出指向給它都不再螢幕上顯示也不存儲
引用變量:${VALNAME} {}有時可以省略
不可以省略的情況:
[root@logstach ~]# name=you
[root@logstach ~]# echo "i am $namer lover"
i am lover
[root@logstach ~]# echo "i am ${name}r lover"
i am your lover
撤銷變量:
unset VARNAME
檢視目前shell中變量:
set
檢視目前shell中的環境變量:
printenv
env
export
腳本:指令的堆砌,按實際需要,結合指令流程控制機制實作的源程式
shebang:魔數
#!/bin/bash
linux隻認為elf是可執行格式,魔數的作用就是告訴核心用什麼解釋器來解釋執行這些ascll代碼,如果perl腳本就用#!/bin/perl,python腳本就用#!/bin/python
練習:寫一個腳本,完成以下任務
1,添加5個使用者,user1...user5
2.每個使用者密碼通使用者名,而且要求添加密碼不顯示passwd傳回的執行結果資訊。
3.每個使用者添加完成後,顯示xxx添加成功字樣。
使用一個變量儲存一個使用者名
删除此變量中的使用者,并删除其家目錄
顯示使用者删除完成資訊。
本文轉自biao007h51CTO部落格,原文連結:http://blog.51cto.com/linzb/1730424 ,如需轉載請自行聯系原作者