bash技巧

bash技巧

  1. 特殊變量shell

    這個應該很是重要吧,不知道你們的規矩,是很危險的.json

    $# 傳給腳本的參數的個數.vim

    $0 腳本本身的文件的名字.數組

    $1 $2 $3 … $n 這個是腳本的第 n 個參數bash

    $@ 傳給腳本的全部參數的列表數據結構

    $* 以一個字符串數組的方式,顯示全部的腳本參數,與位置變量不一樣,參數能夠超過 9 個.curl

    $$ 是腳本運行的但前PID號.函數

    $? 表明最後命令退出狀態,0 表示沒有錯誤,這個值就是c語言main函數裏最後return 的數值.工具

  2. for循環優化

    • 定量循環

      for ((i=1;i<10;i++));do
         #your code
      done
    • 迭代循環

      for i in $(var);do
         #your code
      done
    • 泛循環

      這個名稱不大準確,大概意思就是,循環反問變量的意思

      for i in 變量1 變量2 變量3;do   #不用加$
         echo $i
      done

      輸出 變量1 變量2 變量3 這樣子,這樣就能夠在for裏面循環處理每一個變量的東東.

  3. 判斷文件加是否存在

    if [ ! -d "release" ];then
       #do somethine you like
    fi

    -d 表示檢查後面的字符表示的文件夾是否存在. ! 表示取反

  4. 判斷文件是否存在

    if [ -f "test" ];then
       #do your code
    fi

    可使用!取反

  5. 中途強制結束腳本執行

    寫一個demo以下:

    die(){
        ret=$?
        if [ "$ret" != "0" ];then
            echo "EXECUTE FAIL";
            exit $ret;
        fi
    }
    
    programs1 || die
    programs2 || die

    這樣就保證了program1 執行成功後,纔會執行program2 .

    原理分析.

    1. bash中,返回0 表示成功, 0 在bash邏輯判斷時,被判爲 FALSE.
    2. bash的邏輯判斷具備邏輯短路優化, 即:判斷 && 時第一爲0 提早退出,判斷 || 時,第一個爲 1 提早退出.
    3. 在bash中,調用函數不算是執行命令,因此 $? 的值依然不會由於調用函數改變.
    4. 在bash中 if 也不算是程序,也不影響 $? 的值,可是, [ 算是一個程序,這個程序 判斷參數到 ] ,並返回 0,或者 1 , 因此,在上面, $? 的值,要保存一下, 直接 exit $? 的話,一致返回 0 ,由於那是 [ 的返回值.
  6. shell中的json字符處理

    這個在經過curl作http請求的時候很是有用,由於返回的常常是一個json字符串,使用的工具是 jq (json query);

    解析json字符:

    cat {json file} | jq 這個就會在控制檯以讓人能夠讀的形式進行打印json格式.

    查詢json內容:

    cat {json file} | jq {.key1.key2} 這個就是從 json 的root 開始查找key1,再在key1結構中查找key2,依次類推, 以 . 爲分割,一層一層的向下找 第一個點必須有,表明root,

  7. 把字符串分割爲數組

    1. 空格間隔的字符串分割爲數組

      string="a b c d";
      arry=($string)
      for s in ${arry[@]};do
          echo $s;
      done
    2. 把任意字母分割的數組

      原理,也是使用 arr=($var) 的形式進行轉換的, arr=($var) 使用一個bash的運行變量 IFS 進行分割,默認這個變量爲 ‘ ‘ 空格,只要改變這個變量便可使用咱們想要的分割方法進行分割

      str="a,b,c,d";
      OLD_IFS=$IFS
      IFS=","  #以','分割字符
      #也可使用多個字符做爲分割字符好比
      # IFS='b,c' 這樣的話arr=($str) 後,arr[0]=a,  arr[1]=,d
      arr=($str)
      IFS=$OLD_IFS
  8. 在bash中讀取文件

    1. 所有讀取

      content=`cat ‘{file name}’`

    2. 讀取一行處理

      #第一種方法
      while read line;do
         echo $line  #處理line,line裏就是一行
      done < '{file name}'
      #方式二, 貌似這個方式更優雅一些呢
      cat '{file name}'|while read line;
      do
         echo $line #處理這一行
      done
      #方式三,其實這個不是一行一行的讀取,而是分空格讀取的,即:一行裏有空格後,就按兩行看待
      for line in `cat {file name}`;do
         echo $line
      done
  9. 利用統計數據,繪製統計圖表

    這個功能主要用於方便的宏觀的查看統計數據,數字不是很直觀呢,

    利用gnuplot繪製圖表

    gnuplot是一個gnu組織下的一個科學統計出圖的軟件,功能強大,簡單的統計着實有點牛刀殺雞的感受.

    這個東東出來的東西,利用的數據,是一種以 空格 或者 tab 分割的數據矩陣,而且 全部的數據中,不能有空格,空格在這種數據結構中是有特殊意義的

    能夠利用perl ,bash字符操做等手段,生成這樣的數據.

    使用,這裏主要繪製2d圖形

    gnuplot -e ‘set term png; set output 「{output image path}」; plot 「{data file}」 using 1:3 with lines; ‘

    -e 後面的是gnuplot的命令;直接運行gnuplot會進入互交式界面.

    set term png 指示gnuplot以png格式輸出.

    set output 「{output file path}」 指定gnuplot的輸出文件路徑,gnuplot會生成一個png文件.

    plot 「{data file}」 using 1:3 with lines 以data file的數據繪製圖表,使用數據的第1列和第3列繪製,其中,第一個使用的 列,被gnuplot默認使用爲x軸.第二列將被使用爲y軸,若是使用 splot 命令進行3d圖形繪製,第三列數據被使用爲z軸, with lines 是說把數據文件中的 數據集 以線的形式鏈接,一個文件中能夠有多個數據集,查看 gnuplot使用說明

    額外的命令:

    set xdata time 設置x軸的數據是時間格式, 默認是數字,使用 set xdata 命令恢復數字模式.

    set timefmt 「%Y-%m-%d %H:%M%S」 設置時間的格式,

    set xlabel 「Time」 設置x軸的label. 相似的還有 set ylabel 「YValue」; set zlabel 「ZValue」

    plot|splot 後面跟的with lines 這個就是說繪製圖形處理的時候加的附加設置,詳細查看 gnuplot使用說明

  10. 文本處理

    1. 把多個空格替換爲一個,

      方式不少,這裏介紹sed替換

      df | sed 's/ \{1,\}/ /g'

      使用s命令進行替換, sed手冊 後面的正則:{} 表示從幾個到幾個,沒有的參數自適應(無限多) {還須要轉意, {1,}就是至少一個, 至多不限制的意思, perl中,和vim中的正則會略有變化, vim中,使用* 表示前一個字符重複一次或屢次, perl中, 使用 + 表示前面一個或多個.

  11. 數組的操做

    #按照索引值取內容
    a="${array_name[index]}"
    #取全部數組的內容,通常用於循環和數組轉化爲字符串
    all="${array_name[@]}"
    #切片start開始,數number個,numbers不寫表示取剩下的所有
    slice="${array_name[@]:start:number}"
  12. 字符串的操做

    #切片 和數組差很少,
    #看來shell默認若是有空格就按空格樹index,沒有就一個字符一個字符數index
    slice="{var:start:number}"
    #去右側,也就是最後幾個字符
    last="${var:-length}"
    
    # 有關#和%
    #是刪去左邊的字符(包括指定字符),查找順序是從左往右,#即是找第一個,##找最後一個.
    %是刪去右邊的字符(包括指定字符),查找順序是從右到左,%是第一個,%%是最後一個.
    #*{word}   表示刪去第一個word左邊的字符,
    %{word}*   表示刪去第一個word右邊的字符.
相關文章
相關標籤/搜索