一、vim文本編譯器
vi:Visual Interface,文本編輯器; 文本: ASCII Unicode
文本編輯種類:行編輯器:sed ;全屏編輯器:nano,vi ,vim ;其他編輯器:gedit(圖形),gvim(vim圖形)
使用vi 和vim 的三種主要模式
vim [OPTION]… FILE…
+#: 打開文件后,直接讓光標處于第# 行的行首
+/ PATTERN :打開文件后,直接讓光標處于第一個被匹配到的行的行首
vim + file 直接打開file, 光標在 最后一行
vim –b file 二進制方式打開文件 ;vim –d file1 file2… 比較多個文件
vim -m file 只讀打開文件 ex file 或 或 vim –e 直接進入ex 模式
v 如果該文件存在,文件被打開并顯示內容;如果該文件不存在,當編輯后第一次存盤時創建它
1.1三種主要的模式
命令模式(默認):移動光標。剪切/粘貼文本 ;插入(編輯)模式:修改文本;擴展命令模式:保存,退出。
Esc:總是返回命令模式
移動光標,進入插入模式、擴展模式、命令模式
1.1.1命令模式——>>插入模式
i: insert, 在光標所在處輸入 ;I :在當前光標所在行的行首 輸入
a: append, 在光標所在處后面輸入 ;A :在當前光標所在行的行尾 輸入
o: 在當前光標所在行的下方打開一個新行 ;O :在當前光標所在行的上方打開一個新行
鎖定和解鎖:Ctrl+s ;Ctrl+q
擴展模式:q 退出 ; :q! 強制退出,丟棄做出的修改
:wq 保存退出 ; :x 保存退出
r filename : 讀取filename內容到當前文件中 ; w filename:將當前文件的內容寫入到filename中
!command:執行命令 ; r!command:讀入命令的輸入
1.1.2 擴展模式:地址定界
地址定界:start_pos ,eed_pos
#,+#:如2,+3 表示2到5行 .:當前行 $:最后一行 %:全文,相當于1,$
/pat1/ ,/pat2/:從第一次被pat1 模式匹配到的行開始,一直到第一次被pat2 匹配到的行結束
#,/pat/:從第#行開始,一直到第一次被pat2 匹配到的行結束
/pat/,$ :從第一次被pat 模式匹配到的行開始,一直到行結束
查找:/PATTERN :從當前光標所在處向文件尾部查找 ;?PATTERN :從當前光標所在處向文件首部查找
n :與命令方向相同 ;N:與命令方向相反
替換(s): 在擴展模式下完成查找替換操作
格式:s/ 要查找的內容/ 替換為的內容/ 修飾符; 要查找的內容:可使用模式
替換為的內容:不能使用模式,但可以使用\1, \2, …等后向引用符號;還可以使用“&” 引用前面查找時查找到的整個內容。
修飾符: i: 忽略大小寫; g: 全局替換;默認情況下,每一行只替換第一次出現
gc: 全局替換,每次替換前詢問
查找替換中的分隔符/可替換為其它字符,例如:s@/etc@/var@g s#/boot#/#i
1.1.3命令模式
ZZ:保存退出 ; ZQ:不保存退出
字符間跳轉:h: 左 ;l: 右 ; j: 下 ; k: 上 ; #COMMAND :跳轉由# 指定的個數的字符
單詞間跳轉:
w :下一個單詞的詞首; e :當前或下一單詞的詞尾
b:當前或前一個單詞的詞首; #COMMAND :由# 指定一次跳轉的單詞數
當前頁跳轉:
H :頁首 ; M:頁中間行 ; L:頁底 行首行尾跳轉:
行首行尾跳轉:
^: 跳轉至行首的第一個非空白字符;0: 跳轉至行首;$: 跳轉至行尾
行間移動:#G 、擴展 模式:# :跳轉至由# 指定行;G :最后一行;1G, gg: 第一行
翻屏操作:
Ctrl+f: 向文件尾部翻一屏 ; Ctrl+b: 向文件首部翻一屏
Ctrl+d: 向文件尾部翻半屏 ; Ctrl+u:向文件首部翻半屏
字符編輯:
x: 刪除光標處的字符;#x: 刪除光標處起始的# 個字符
xp: 交換光標所在處的字符及其后面字符的位置 ; ~:轉換大小寫
替換命令:r:替換光標所在處的字符
刪除命令d: d$:刪除到行尾; d^:刪除到非空行首; d0:刪除到行首;dd:刪除光標所在的行
#dd:多行刪除; D:從當前光標位置一直刪除到行尾,等同于d$。
復制命令(y,yank):y:復制,行為相似于d命令 yy:整行復制; Y:從光標位置復制到行尾
#yy:復制多行
粘貼命令(p,paste):p:緩沖區存的如果為整行,則粘貼當前光標所在行的下方;否則,則粘貼至當前光標所在處的后面。
改變命令:(c)修改后切換至插入模式。同刪除復制命令。
撤銷更改: u 撤銷最近的更改; #u 撤銷之前多次更改; U 撤消光標落在這行后所有此行的更改
按Ctrl – r 重做最后的“撤消”更改; . 重復前一個操作; v n.:重復前一個操作n次
特殊用法:100iwang [ESC] :粘貼“wang ”100次
<start position><command><end position>
Command: y 復制、d 刪除、gU 變大寫、gu 變小寫
如 例如 0y$ 命令意味著:
0 → → 先到行頭 ;y → → 從這里開始拷貝; $ → → 拷貝到本行最后一個字符
ye:從當前位置拷貝到本單詞最后一個字符
1.2 vim寄存器
有26 個命名寄存器和1 個無命名寄存器,常存放不同的剪貼版內容,可以不同會話間共享。
用a ,b,…,z 表示, 用“ 寄存器表示,放在數字和命令之間
如:3"tyy 表示復制3 行到t 寄存器中
"tp 表示將t 寄存器內容粘貼
未指定,將使用無命名寄存器
有10 個數字寄存器,用0 ,1 ,… ,9 表示,0 存放最近復制內容,1 存放最近刪除內容。當新的文本變更和刪除時,1 轉存到2 ,2 轉存到3 ,以此類推。數字寄存器不能在不同會話間共享
編輯二進制文件:
以二進制方式打開文件 vim –b binaryfile
擴展命令模式下,利用xxd 命令轉換為可讀的十六進制 :%!xxd
編輯二進制文件
擴展命令模式下,利用xxd 命令轉換回二進制 :%!xxd –r
保存退出
可視化和多窗口
1.3 定制vim的工作特性
配置文件:永久有效 全局:/etc/vimrc ;個人:~/.vimrc
擴展模式:當前vim 進程有效
(1) 行號
顯示:set number, 簡寫為set nu ;取消顯示:set nonumber, 簡寫為set nonu
(2) 括號成對匹配
匹配:set showmatch, 簡寫為set sm ;取消:set nosm
(3) 自動縮進
啟用:set ai ;禁用:set noai
(4) 高亮搜索
啟用:set hlsearch ;禁用:set nohlsearch
(5) 語法高亮
啟用:syntax on ;禁用:syntax off 、shirt:noh回車
(6) 忽略字符的大小寫
啟用:set ic ;不忽略:set noic
(7) 文件格式
啟用windows 格式:set fileformat=dos ;啟用unix 格式:set fileformat=unix
(8) 設置文本寬度
:set textwidth=65 (vim only) ; :set wrapmargin=15
:help option-list ; :set or :set all
vi/vim內置幫助
:help ; :help topic ; Use :q to exit help
vimtutor
二、*shell腳本編程
2.1 shell的簡單介紹
編程基礎 : 程序:指令+數據
程序編程風格:過程式:以指令為中心。數據服務于指令。
對象式:以數據為中心,指令服務于數據
shell程序:提供了編程的能力,解釋執行
程序的執行方式:計算機運行二進制指令
編程語言:低級語言:匯編語言
高級語言:編譯:高級語言à編譯器—>目標代碼 (java,c,c++)
解釋:高級語言—>解釋器—>機器代碼 (shell ,prel,python)
編程的基本概念:
編輯邏輯處理方式:順序執行 循環執行 選擇執行
shell編程:過去式、解釋執行
編程語言的基本結構:
數據存儲:變量、數組 表達式:a+d 語句:if
shell腳本基礎
shell腳本是包含一些命令或聲明,并符合一定格式的文本文件
格式要求:首行執行shebang機制:
#!/bin/bash #!/usr/bin/python #!/usr/bin/perl
2.2 shell腳本的用途
1、自動化常用命令;2、執行系統管理和故障排除;3、創建簡單的應用程序;4、處理文本或文件
創建shell腳本:
第一步:使用文本編輯器來創建文本文件
第一行必須包括shell聲明序列:#!/bin/bash ;添加注釋以#開頭
第二步:運行腳本
給予執行權限,在命令行上指定腳本的絕對或相對路徑;直接運行解釋器,將腳本作為解釋器程序的參數運行
腳本調試:
bash –n /path/to/some_script(腳本名) :檢查第幾行的語法錯誤,不能檢查到命令的錯誤
刪除PATH變量的命令的腳本路徑;同時還需要用hash –d cmd 清除路徑
bash –x /path/to/some_script:調試執行
bash:即使腳本沒有執行權限,也可以用bash運行
2.3 變量
變量:命令的內存空間
數據的存儲方式: 字符; 數值:整型;浮點型
變量作用:1.數據存儲格式;2.參與的運算;3.表示數據范圍
類型:字符;數值:整型、浮點型
強類型:定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤如:java,pyrhon
弱類型:無須指定類型,默認為字符型;參與運算會自動進行隱式類型轉換;變量無需事先定義可直接調用
如:bash不支持浮點數
變量的命名法則:
1.不能使用程序中保留字:如if,for ; 2.見名知義
3.只能使用數字、字母、和下劃線,且不能以數字開頭; 4.統一命名規則:駝峰命名法
bash中變量的種類:
2.3.1本地變量
生效范圍為當前shell進程,對當前shell之外的其他shell(包括子shell)進程都無效 當然子shell進程的變量也不能在父進程中生效。
變量賦值:name=”value”
可以使用引用的value的條件:
(1)可以是直接字串:name=”root” ;(2)變量引用:name=”$USER” ;
(3)命令引用:name=`COMMAND` ; name=$(command) ;
變量引用:${name} ,$name
“”:弱引用,其中的變量引用會被替換為變量值 ; ‘’:強引用,其中的變量引用保持原字符串
set命令可以查看系統定義的所有變量,還有函數; 刪除變量:unset name
編寫的腳本相當于子進程,可以直接使用系統定義的環境變量。
pstree顯示當前的進程樹; 腳本中sleep表示休眠一會兒,利于查看進程樹
2.3.2 環境變量
用export(等價于declare – x)聲明能把父進程的變量傳遞給子進程,但是如果子進程設置的環境變量與父進程沖突,那父進程中顯示的是子進程的變量。而且子進程定義的變量不會傳遞給父進程。(bash特殊例外)
變量聲明、賦值:export name =value ; declare –x name =value
變量引用:${name} ,$name
env、printenv、export命令可以所有顯示環境變量; 刪除變量:unset name
bash中有許多內建的環境變量:PATH,SHELL,USER,UID,HISTSIZE,HOME,PWD,OLDPWD,HISTFILE
局部變量
生效范圍為當前shell進程中某代碼片段(通常指函數)fun1() { locate var=function; },只在函數中使用。
只讀變量
只能聲明,不能修改刪除: readonly name ; declare -r name
2.3.3 位置變量
$1,$2,$3……來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
$1, $2, … :對應第1 、第2 等參數,shift [n] 換位置 但是到$10就必須用${10} ;$0: 命令本身
示例:判斷給出的文件的行數
linecount="$(wc -l $1| cut -d' ' -f1)" echo “$1 has $linecount lines.”
2.3.4 特殊變量:$?,$0,$*,$@,$#
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數 ;$@ 與$* 只在被雙引號包起來的時候才會有差異
2.4 bash中的算術運算
help ;let +, -, *, /, % 取模(取余), ** (乘方)
實現算術運算:
(1) let var= 算術表達式 ; (2) var=$[ 算術表達式 ](表達式前后有空格) ; (3) var=$(( 算術表達式 ))
(4) var=$(expr arg1 arg2 arg3 …) ; (5) declare -i var = 數值 ; (6) echo ‘ 算術表達式’| bc
乘法符號有些場景中需要轉義 ; [[ ]]:兩個括號才能支持正則表達式
bash 有內建的隨機數生成器:$RANDOM (1-32767)
echo $[$RANDOM%50] :0-49之間的隨機數
賦值:增強型賦值: += ,-= ,*= ,/= ,%=
let var(變量)OPERvalue 例如:let count+=3 ,自加3后自賦值
自增,自減: let var+=1 , let var++ , let var-=1 , let var—
(注意:變量用完了,注意unset,要不然可能與bash中運行的起沖突)
2.4.1 邏輯運算
true 用1表示;false用0表示
與:1 與 1 = 1; 1 與 0 = 0; 0 與 1 = 0; 0 與 0 = 0 (取?。?/span>
或:1 或 1 = 1; 1 或 0 = 1; 0 或 1 = 1; 0 或 0 = 0 (取大)
非!: !1=0 ; !0=1
2.4.2 短路運算
短路與:第一個為0 ,結果必定為0;第一個為1,第二個必須參加運算
短路或:第一個為1,結果必然為1;第一個為0,第二個必須參加運算
異或:^ 異或的兩個值,相同為假,不同為真
聚集命令:復合式:date;who | wc -l (命令會一個接一個地運行)
子shell:(date;who | wc -l)>> /tmp/trace (所有的輸出都會被發給單個標準輸出和錯誤輸出)
退出狀態:進程使用退出狀態來報告成功或失敗 ;
0:代表成功;1-255:代表失敗 ; $?:變量保存最近命令的退出狀態(shell中最后一個命令)
例如: #ping –c1 –w1 hostdown &> /dev/null && echo the host is up (用來掃描網段是否開通)
退出狀態碼:exit [n] :自定義退出狀態碼
注意:腳本中一旦遇到exit命令,腳本會立即退出;終止退出狀態取決于exit命令后面的數字(0:成功)
注意:如果未給腳本指定退出狀態碼,整個腳本退出狀態碼取決于腳本執行的最后一條命令狀態碼
2.5 編寫shell腳本
2.5.1 條件測試
判斷某需求是否滿足,需要由測試機制來實現;專用的測試表達式需要由測試命令輔助完成
評估布爾聲明 ,以便在條件性執行使用 若成功(為真),則返回0;若失敗(為假),則返回1。
測試命令:test expression ; [ expression ] ;[[ expression ]];(注意:expression 前后必須要有空白字符)
條件性的執行操作符:根據退出狀態而定,命令可以有條件的運行
&&表示條件性的and ,then 若cmd1執行完畢且$?=0,則開始執行cmd2;若cmd1$?≠0,則不執行cmd2
||表示條件性的or else 若cmd1執行完畢且$?=0,則不執行cmd2;若cmd1$?≠0,則繼續執行cmd2
test命令:長格式的例子:
$test “$A” == “$B” && echo “Strings are equal” (比較字符串是否相等)
$ test “$A” –eq “$B” && echo “Integers are equal” (比較數字是否相等)
簡單格式的例子:
$[ “$A” == “$B” ] && echo “Strings are equal”
$ [ “$A” –eq “$B” ] && echo “Integers are equal”
2.5.2 數值測試
-gt:是否大于 ;-ge:是否大于等于 ;-eq是否等于
-lt:是否小于 ;-le:是否小于等于 ;-ne:是否不等于
常在if結構中出現
2.5.3 字符串測試
== :是否等于; >: ascii 碼是否大于ascii碼 ; <: 是否小于
!=: 是否不等于 ; =~: 左側字符串是否能夠被右側的PATTERN所匹配
注意: 此表達式一般用于[[ ]] 中;擴展的正則表達式
-z "STRING" :字符串是否為0個,空為真,不空為假
-n "STRING" :字符串是否不為0個,不空為真,空為假
注意:用于字符串比較時的用到的操作數都應該使用引號
2.5.4文件測試
2.5.4.1 存在性測試
–a FILE :同-e ; -e FILE: 文件存在性測試,存在為真,否則為假
存在性及性能測試:-b FILE :是否存在且為塊 設備文件
-c FILE :是否存在且為字符 設備文件 ; -d FILE :是否存在且為 目錄文件
-f FILE :是否存在且為 普通文件 ; -h FILE 或 或 -L FILE :存在且為符號 鏈接文件
-p FILE :是否存在且為命名 管道文件 ;-S FILE :是否存在且為套接先判斷存在性,再判斷類型
注意:-f有一個坑,會判斷鏈接文件指向的文件或者目錄;
因而,判斷文件類型,先判斷文件是否存在,再判斷文件是否是鏈接文件,最后才判斷文件類型
例如:/bin 是一個特殊的鏈接文件 find查找bin下的目錄 必須用 find /bin/
2.5.4.2 文件權限測試
-r FILE :是否存在且可讀 ;-w FILE: 是否存在且可寫 ;-x FILE: 是否存在且可執行
注意:-x:文件沒有x的話即使是root也沒有執行權限
文件特殊權限測試:-u FILE :是否存在且擁有suid 權限 ;
-g FILE :是否存在且擁有sgid 權限 ; -k FILE :是否存在且擁有sticky 權限
2.6.3 文件大小測試
-s FILE:是否存在且非空
文件是否打開: -t fd: fd 表示文件描述符是否已經打開且與某終端相關
-N FILE :文件自動上一次被讀取之后是否被修改過
-O FILE :當前有效用戶是否為文件屬主 ; -G FILE :當前有效用戶是否為文件屬組
2.5.5 雙目測試
FILE1 -ef FILE2: FILE1 與FILE2 是否指向同一個設備上的相同inode
FILE1 -nt FILE2: FILE1 是否新于FILE2 ; FILE1 -ot FILE2: FILE1 是否舊于FILE2
2.5.6 組合測試
第一種方式:
COMMAND1 && COMMAND2 并且 ; COMMAND1 || COMMAND2 或者
! COMMAND 非 如:[[ -r FILE ]] && [[ -w FILE ]]是否為可讀和可寫文件
第二種方式:
EXPRESSION1 -a EXPRESSION2 并且 ; EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION 非 ;必須使用測試命令進行; 格式必須要嚴格,必須是單個括號;多個括號就不能匹配-a,-o了;
v示例:# [ -z “$HOSTNAME” -o $HOSTNAME "=="localhost.localdomain" ] && hostname www.magedu.com
空字符串$HOSTNAME或者主機名為localhost.localdomain,就執行homename改為www.magedu.com
# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
/bin/cat文件為可執行且普通文件,就執行訪問/etc/fstab
2.6 read命令來接受輸入
使用read來把輸入值分配給一個或多個shell變量:
-p:指定要顯示的內容,相當于echo,備注信息 ; -t :輸出時間
read – p “Enter a filename:” FILE (FILE前面有空格)
read 從標準輸入中讀取值,給每一個單詞分配一個變量所有剩余單詞都被分配給最后一個變量。
使用read功能接收輸入內容:讀變量如:read name echo $name
vim inputyourname
#!/bin/bash
#
#echo “please input your name ”
read –t 3 –p “please input your name:” name
echo “your name is $name”
read –p “Do you agree ? yes or no:”answer
[ $answer==yes ]&&echo “haha”|| echo “hehe”
按生效范圍劃分,存在兩類:
全局配置:/etc/profile /etc/profile.d/*.sh /etc/bashrc
個人配置:~/.bash_profile ~/.bashrc
建議修改用戶登錄是的信息建議在/etc/profile.d/*.sh 中
source和bash的區別: bash 會影響子進程的腳本 ;source僅影響自己本身的腳本
3.1 shell登錄的兩種方式
3.1.1 交互式登錄
(1) 直接通過終端輸入賬號密碼登錄;(2) 使用“su – UserName” 切換的用戶
執行順序:/etc/profile –> /etc/profile.d/*.sh –>~/.bash_profile –> ~/.bashrc –> /etc/bashrc
profile類:為交互式登錄的shell提供配置:
全局:/etc/profile 、/etc/profile.d/*.sh ;個人:~/.bash_profile
功用:(1)用于定義環境變量 ; (2):運行命令和腳本
3.1.2非交互式登錄
(1)su UserName ;(2) 圖形界面下打開的終端 ;(3) 執行腳本
執行順序:~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
bashrc 類:為非交互式和交互式登錄的shell提供配置:
全局:/etc/bashrc ; 個人:~/.bashrc
功用:(1)定義命令別名和函數 ;(2)定義本地變量
3.2 編輯配置文件生效
修改profile和bashrc文件后需生效的兩種方法:
1.重新啟動shell進程 ; 2. .或source 例如: .~/.bashrc
bash保存在~/.bash_logout文件中(用戶);在退出登錄shell時運行;用于創建自動備份、清除臨時文件。
du sh file 可以查看文件file的大小,便于查看清除不需要的臨時文件
3.3bash如何展開命令行
1.把命令行分成單個命令詞 2.展開別名 3.展開大括號種的聲明({})
4. 展開波浪符聲明(~) 5.命令替換$() 和 “ 6.再次把命令行分成命令詞
7.展開文件通配(* 、? 、[abc] 等等) 8.準備I/0 重導向(< 、>) 防止擴展
反斜線(\ )會使隨后的字符按原意解釋
如:$ echo Your cost: \$5.00 Your cost: $5.00
加引號來防止擴展: 單引號(’ )防止所有擴展
雙引號(” )也防止所有擴展,但是以下情況例外:
$ (美元符號) - 變量擴展 ; ` (反引號) - 命令替換
\ (反斜線) - 禁止單個字符擴展 ; ! (嘆號) - 歷史命令替換
原創文章,作者:lyx,如若轉載,請注明出處:http://www.www58058.com/60601