linux shell 簡單用法

1. Linux shell中, 可以將linux 中的命令放入到 xxx.sh文件中, 構成一個shell腳本。

 

2. Linux 管道表示 “ | ” ,  例如 A | B , 即是將A 命令執行的結果, 做爲傳入, 給B命令執行, 例如: ls -l | grep http , 意思爲:顯示當前目錄下所有文件, 過濾出包含“http”字符的文件。

 

3. 重定向: < , > , >>  , < 是將 < 右邊的作爲左邊的輸入, > 是重新寫入, 通常是到文件中 “ls -l > a.txt ” , >> 是追加操作, 將數據從文件的末尾添加上去, 不從文件的頭部開始寫。

    2> 就是將命令中錯誤的信息重新定向 , 還有類似的 2>> , 此爲追加操作。

    0表示標準輸入 ,1表示標準輸出 ,2表示標準錯誤輸出 ,> 默認爲標準輸出重定向,與1> 相同 , 2>&1 意思是把標準錯誤輸出重定向到標準輸出。 &>file表示標準輸出和標準錯誤輸出都重定向到文件file中。

 

4. 命令協作: &&, || , ;   &&  兩個命令都需要執行成功,  || 如果前面的命令執行成功, 則不執行後面的命令 , 跟C語言中的類似。 ; 表示, 前面的命令執行完後, 緊接着執行後面的命令。

 

5. 變量定義

   Linux shell 可以直接定義變量, 形式爲 變量名 = 變量值 , 如果 hello = haha , 如果要利用該變量的值,在前面需要添加上 $hello 來取到變量的值。測試例子:

  命令行中: hello = haha  回車 echo $hello 顯示 haha (賦值時, = 號前後最好不要留有空格)

 

6 . 雙引號 , 和 單引號 , 反撇號(鍵盤1左邊的那個按鍵)

     雙引號中是允許有引用的如在雙引號中有開始定義的$hello , 則在執行過程中 會當作haha 來處理, 如果使用單引號擴起來的, 則會直接輸出, 不管是否是引用。

     echo "$hello"  顯示 haha  而 echo '$hello'  顯示 $hello 。反撇好, 包含的內容不是字符串, 而是一個命令, 可將其包含的` `執行後的結果, 做其他用, 比如賦值。

 

7 . 由系統或腳本控制,不可直接賦值的特殊變量

     $?  : 前一條命令的狀態值, 0 爲正常 , 非0異常
     $0  : 腳本自身的程序名
     $1 - $9 : 第1-第9個位置參數
     $* : 命令行的所有位置參數的內容
     $# : 命令行的位置參數個數

 

8 . 計算表達式, 可以用expr 命令 , 格式是 expr  數值1 操作符  數值2    或者 使用 $[] , 格式是 $[數值1  操作符  數值2] , 例如:kkk = `expr 1 + 3 ` echo $kkk 顯示4 , 而 $[1 + 3] , 這個結果會替換這個式子本身 , 也是4 。在expr使用 * 的時候, 我們需要用一個 \* , 因爲 * 在linux 系統中是通配符。而在利用 $[]的時候, 無需要轉義。

 

9 . let 變量名++ , let 變量名-- , 變量的遞更處理。 也可以這樣用 X+=2 。 RANDOM是一個特殊的變量, 它可以生成隨機數。seq 可以生成數字序列, 用法爲:

seq 首數  末數 , 生成首數到末數之間的數, 如果首數沒有指定, 則從1開始到末數, 步長默認爲1 ,例如:seq 3 , 則顯示 1 2 3  。還有一種語法是 seq 首數 步長 末數 , 這樣就顯示從首數開始遞增加步長, 直到超過末數。 用bc 來做小數處理,例如: echo "45.67-21.45" | bc   , 由於小數在除法的過程中可能會出現無限循環的小數, 則我們需要有時候需要限制小數的小數位數, 例如: echo “scale =4; 10/3 ” | bc  利用 scal=n 來指定位數。

 

10 . 字符串截取操作

      dirname 命令, 顯示文件的文件夾位置, basename命令, 顯示文件的文件名。expr substr  $var1  起始位置 截取長度  , 還可以使用 ${}表達式, 來截取字符串格式: ${var1:起始位置:截取長度}。expr 截取的起始位置是從1開始編號的, 而 $var的起始位置是從0開始編號的。所以在使用這兩個字符串截取時候,需要注意相差一位。$截取時,如果起始位置省略,就從頭開始截取, 寫法爲${var::4}。

 

11. 字符串替換

      格式一:${var/old/new} ,將var變量值中第一個old字符串用new來替換 ,格式二: ${var//old/new} ,將var變量值中的所有的old都用new來替換。

 

12. 測試操作規範: test 條件表達式 或者  [條件表達式] 。

 

13. 存在及識別 : -e : 目標是否存在(Exist)   -d: 是否爲目錄(Directory)  -f :是否爲文件(File) 。權限的檢測 : -r :是否有讀取(Read)權限 ,-w : 是否有寫入(Write) 權限

      -x : 是否有可執行(eXcute)權限。整數值比較: -eq:等於(Equal) , -ne : 不等於(Not Equal) , -gt: 大於(Greater Than),-lt : 小於(Lesser Than) , -ge : 大於或等於(Greater or Equal) , -le: 小於或等於(Lesser or Equal)。例如:[$(who | wc -l)  -eq 2 ] && echo "yes" 。

 

14. 單分支if語句結構:               雙分支if語句結構:                                  多分支if語句結構

      if  條件測試                            if    條件測試                                          if  條件測試1
            then  命令序列                         then  命令序列1                                          then  命令序列1
      fi                                                     else   命令序列2                           elif      條件測試2
                                                    fi                                                                        then  命令序列2
                                                                                                                  .........
                                                                                                                  else   命令序列n
                                                                                                                  fi  

15 .  for 循環語句格式:

          for 變量名  in  取值列表    
          do 
                    命令序列
          done

 

16 .  case 語句格式:

         case  變量值  in
           模式1 )
                    命令序列1
                     ;;
           模式2 ) 
                    命令序列2
                     ;;
           * ) 
                    默認命令序列
          esac

17 . 如果腳本需要被系統調用chkconfig來管理, 首先需要能夠識別start | stop 命令, 對於有些系統red hat centOS ,

       需要在普通的shell腳本開頭添加chkconfig的相關參數:

       #/bin/bash
       #chkconfig   -90  10  
       #description: 描述的語句

       我們還需要將我們的腳本放到/etc/init.d/下面, chkconfig --add 腳本 , 添加後chkconfig就能夠管理這個shell服務腳本了。

       舉例說明shell文件名爲(shelllinux):

       

#!bin/bash
#chkconfig -90 10
#description: this is my shell!
case "$1" in
start)
        echo "start";
        `ls >> /usr/start.txt` ;
        sleep  3600 & 
        ;;
stop)
        echo "stop"
        pkill -x "sleep"
        ;;
*)
         echo "you can [start|stop]"
esac

然後將,shelllinux文件放入到/etc/init.d/下面, chkconfig --add shelllinux ,OK ,搞定了!如果想要開機自動運行, 就chkconfig shelllinux on 。

對於ubuntu, 它沒有chkconfig , 我們可以用update-rc.d 命令來。

添加的頭block是這樣的:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          scriptname
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

再執行update-rc.d  shelllinux defaults 這樣重啓過後,我們的腳本就會在系統啓動的時候加載執行了,判斷腳本是否執行,觀察case start), 後面執行命令序列的效果。

如果不希望執行只需要update-rc.d -f  shelllinux  remove 即可!瞭解更多,請了解運行級別。

18 . awk基本命令格式:

       awk '模式 {操作}'  文件1  文件2 例如:awk 'NR==1{print}'  /etc/hosts, 就會顯示第一行/etc/hosts

       awk命令有很多的內置變量:

       NR  :當前處理行的序數(行號)
       FS   : 字段分隔, 缺省爲空格或Tab位
       $n   : 當前行的第n個字段
       $0   : 當前行的所有文本內容

       示例文本(file.txt):    

1 This is the first line.
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy
4 hunter:x:504:504::/home/sely:/bin/bash

       命令行中執行:awk  'NR==1,NR==3{print}'  file.txt  就會顯示從第1行到第3之間的所有內容。

1 This is the first line.
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy 

       命令行中執行:awk  '(NR==1)||(NR==3){print}'  file.txt 就會顯示

1 This is the first line.
3 192.168.4.2 sss.eee.yyy       

       還可以按照奇偶行來輸出: awk  '(NR%2)==0{print}'  file.txt 顯示如下

2 Hello, Everybody!
4 hunter:x:504:504::/home/sely:/bin/bash

      awk 還可以使用正則表達式, 用/ /包含出來。  awk  '/2/{print}'  file.txt  (打印所有包含2字符所在的行)

2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy

      awk  '/bash$/{print}'   file.txt  (打印所有包含以bash結尾的行, 這裏的$符號是表示結尾的意思)

4 hunter:x:504:504::/home/sely:/bin/bash

      指定輸出字段: awk  'NR==2,NR==3{print $1,$3}'  file.txt

2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy

     指定按照字符分隔用法: awk  -F.   '$5=="eee"{print $0}'  file.txt  (-F指定分隔符這裏是“ . ” , 指定第五個字段爲"eee“ ,就輸出整行)

3 192.168.4.2 sss.eee.yyy

19 .  seb  語法格式:

          sed   '編輯指令'  文件1  文件2 .....
          sed    -n   '編輯指令'   文件1  文件2 ....
          sed    -i    '編輯指令'   文件1  文件2 ....

        例如: sed  -n  '3,5p'  /etc/hosts   (將/etc/hosts內容中的第3行到第5行p=print出來)。

           編輯指令的寫法: 格式:[地址1[,地址2]] 操作類型,   多條指令之間以分號隔開。 sed  -n  '3p;5p'  /etc/hosts (輸出第3行和第5行)。如果多個單引號區間, 則他們之間需要加上 -e隔開。常用的操作類型有:

        p   輸出/打印文本行   n  取下一行文本(跳過當前行)  d  刪除  s  字符串替換     a  追加新的文本。

         爲了測試sed 命令,我們同樣建立個file.txt文本:

1 This is the first line.
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy
4 hunter:x:504:504::/home/sely:/bin/bash

         輸出所有的奇數行: sed  -n  'p;n'  file.txt

1 This is the first line.
3 192.168.4.2 sss.eee.yyy

         輸出所有的偶數行: sed  -n   'n;p'  file.txt       

2 Hello, Everybody!
4 hunter:x:504:504::/home/sely:/bin/bash

         使用正則表達式:  sed  -n   '/eee/,$p'  file.txt    (輸出eee所在的行到最後一行的內容)

3 192.168.4.2 sss.eee.yyy
4 hunter:x:504:504::/home/sely:/bin/bash

        使用正則表達式查找單詞所在的行:  sed  -n  '/\<This\>/p'  file.txt  (\是用來轉義<和>的)

1 This is the first line.

        刪除符合條件的行: sed  '2,3d'  file.txt  (會將file.txt中的第2行到第3行之間的內容刪除後,顯示出剩下的文本,不會涉及到file.txt的實際內容)

1 This is the first line.
4 hunter:x:504:504::/home/sely:/bin/bash

        刪除符合條件的行和最後一行: sed  '/eee/d;$d'  file 

1 This is the first line.
2 Hello, Everybody!

        刪除不符合條件的行: sed  '/eee/!d'  file.txt  如果在前面加 -i 就會影響到文件的內容。

3 192.168.4.2 sss.eee.yyy









 

                 

發佈了28 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章