vim編譯器與shell腳本簡介

一、vim文本編譯器  

    viVisual Interface,文本編輯器;   文本 ASCII Unicode

 文本編輯種類:行編輯器sed  ;全屏編輯器:nano,vi ,vim ;其他編輯器:gedit(圖形),gvimvim圖形)

    使用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  表示25行   .當前行   $最后一行    %:全文,相當于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,yanky復制,行為相似于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 shirtnoh回車

 (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表示;false0表示

1 1 = 11 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”

三、bash的配置文件

生效范圍劃分,存在兩類:

全局配置:/etc/profile      /etc/profile.d/*.sh       /etc/bashrc

個人配置:~/.bash_profile     ~/.bashrc

建議修改用戶登錄是的信息建議在/etc/profile.d/*.sh

sourcebash的區別: 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 編輯配置文件生效

修改profilebashrc文件后需生效的兩種方法:

    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

(0)
lyxlyx
上一篇 2016-11-24
下一篇 2016-11-24

相關推薦

  • 基本網絡設置

    我們在上網的時候會遇到各種各樣的問題,比如有時候網絡不通,沒有ip地址,或者ip地址有沖突等等,這就需要我們懂得一些網絡的配置,方便以后使用?;揪W絡配置:主機名,ip地址,網關,DNS服務器。1、 主機名的配置第一種方法:在配置文件修改Centos7版本:vim /etc/hostname 改過配置文件后需要使其生效,命令為hostname centos7…

    2017-09-09
  • N26-第五周

    1、顯示當前系統上root、fedora或user1用戶的默認shell; [root@localhost test]# cat /etc/passwd | grep -E “^(root|fedora|user1)\>” |cut -d: -f  1,7 root:/bin/bash user1:/bin/bash …

    Linux干貨 2017-02-26
  • vsftpd

    文件服務: 安裝開啟服務前先關閉selinux,清空iptables策略。避免不必要的麻煩,服務開啟后,配置一切正常有需要再根據情況開啟。 ftp:應用層,C/S,跨主機的文件共享服務;file transfer protocol nfs,cifs:文件系統接口,網絡文件系統;     nfs:network&nbsp…

    Linux干貨 2016-11-01
  • Linux下的find命令詳解

    Linux下的find命令詳解 在linux下有兩種查找符合條件文件的命令,是locate和find。我們來說說find這個命令。 find: 實時查找工具,遍歷查找指定路徑下的所有的文件來找到符合條件的文件。 特點:查找文件比locate速度略慢,查找文件很精確,并且是實時進行查找的。 使用方法:find [OPTIONS] [查找起始路徑] [查找條件]…

    Linux干貨 2018-03-20
  • 新鮮出爐的一篇好PPT,MySQL Optimizer團隊力作

    新鮮出爐的一篇好PPT,MySQL Optimizer團隊Senior Principal Software Engineer ?ystein同學親自操刀完成的《How to Analyze and Tune MySQL Queries for Better Performance》內容值得期待,有實現分析,有實戰用例。有需要的朋友可以點擊下載! 下載地址:…

    Linux干貨 2015-02-27
  • 系統啟動和內核管理以及幾個重要實驗

    Centos啟動流程:     1.加載BIOS的硬件信息,獲取第一個啟動設備     2.讀取第一個啟動設備MBR的引導加載程序(grub)的啟動信息     3.加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備 &n…

    Linux干貨 2017-05-15
欧美性久久久久