shell基礎筆記

shell基礎:mysql

sh命令:
    參數:
     -c string     將string看成命令來執行。注意區別:string是用單引號擴起來的還上用雙引號擴起來的!
     -x    xxx.sh    開啓調試模式,shell在執行腳本的過程當中把它實際執行的命令都顯示出來,而且在命令的行首顯示一個"+"號(shell內置變量PS4='+ '),同set -x。
         補充:能夠經過修改$PS4的值,從而使每一條實際執行的命令前面顯示其行號以及所屬的函數名。eg:先執行export PS4='+{$LINENO:${FUNCNAME[0]}} ', 而後再使用「-x」選項來執行腳本。
     -n 不執行腳本,而是去讀一遍腳本中的命令,目的是爲了檢查腳本中的語法錯誤。linux


# !/usr/bin/env bash
說明:腳本解釋器在linux中可能被安裝在不一樣的目錄,而env能夠在系統的PATH目錄中查找,故腳本用env啓動。sql


命令 -/+參數
    -參數    設置某個參數
    +參數    取消某個參數的設置。    shell


set命令:
    參數:
        無參 列出全部的環境變量。
        -e     當命令的返回值不等於0(即執行該命令報錯)時,當即退出shell。
        +e     表示取消-e參數,即當命令的返回值不等於0時,不會當即退出shell,而是會繼續執行shell腳本。
        -x     開啓調試模式。數據庫


declare命令:
    說明:用於聲明shell變量
    參數:
        -r     將變量聲明爲只讀變量。eg:declare -r name=jack
        -x  將變量設置爲環境變量,該變量可供shell之外的程序來使用。數組


echo命令:
    參數:
        -e     將特殊字符進行轉義。 
            \a 發出警告聲
            \c 最後不加換行符號
            \f 換行但光標仍舊停留在原來的位置
            \n 換行且光標移至行首
            \r 光標移至行首,但不換行
            \t 插入tabbash


let命令:
    說明:let命令是bash中用於計算的工具,用於執行一個或多個表達式,變量計算中不須要加上$來表示變量。若是表達式中包含了空格或其餘特殊字符,則必須引發來。
    舉例:
        let i=i+1
        let i++函數

    
mail命令:
    方式一:
        在shell窗口中編輯內容,編輯完成後按ctrl+d退出編輯環境,郵件便可發送。
        mail -s "郵件主題" jxn@speed.com工具

    方式二:
        mail -s "郵件主題" jxn@speed.com < content.txtthis

    方式三:
        cat "mail content" | mail -s "郵件主題" jxn@speed.com 

    補充:
        ctrl+c     終止當前任務命令或程序。
        ctrl+d     退出當前用戶環境,至關於exit。


命令行參數
    $0     腳本的名字
    $1, $2, ..., $9  腳本第1個到第9個命令行參數
    $#     命令行參數的個數
    $*     以「參數1 參數2 參數3..」    的形式返回全部命令行參數的值
    $@     以「參數1」「參數2」「參數3」..    的形式返回全部命令行參數的值
    $?     最後一條命令的退出狀態碼(執行成功返回0,執行失敗返回1)
    $$     正在執行的進程的ID(PID)


    getopts命令:

        概念:獲取命令行的參數。
        格式:getopts argString varName
        說明:
            1)參數後面加冒號表示該參數能夠接受賦值。
            2)若argString以冒號開頭,則表示忽略錯誤。eg:
                若argString爲 a: 那麼,a必須賦值,不然會報錯。
                若argString爲 :a: 那麼,a即便不賦值,也不會報錯。
        使用:
            while getopts :i:na: opt
            do
                    case ${opt} in
                            i) echo 'this is param i value '$OPTARG
                            ;;
                            n) echo 'has param n'
                            ;;
                            a) echo 'this is param a value '$OPTARG
                            ;; 
                    esac
            done

            # 驗證:sh my.sh -i 99 -n -a asdf

變量:
    引用變量:
        ${variable}
        $variable

    清除變量:
        unset variable

    變量替換
        $variable                保存在variable中的值
        ${variable}            保存在variable中的值
        ${variable:-string}     若是variable的值非空,則值爲variable,不然值爲string
        ${variable:+string}     若是variable的值非空,則值爲string,不然值爲空
        ${variable:=string}     若是variable的值非空,則值爲variable,不然值爲string且variable的值設置爲string
        ${variable:?string}     若是variable的值非空,則值爲variable,不然顯示string並退出

    引號的說明【重要】:
        單引號括起來的的字符都做爲普通字符對待。
        雙引號括起來的字符,除$、\、'(單引號)、"(雙引號)以外,其他字符做爲普通字符對待。
        反引號括起來的字串被shell解釋成命令,在執行時,shell首先執行該命令,並以它的標準輸出結果取代整個反引號部分。

    將命令的執行結果賦值給變量:
        # 將某個shell命令的執行結果賦給某個變量。注:賦值號「=」的左右兩邊不能直接跟空格,不然shell會將其視爲命令。
        variableName=`command`
        variableName=$(command)

    定義系統提示符的變量

        eg:PS1='[\u@\t \w]\$ '

        \u:顯示當前用戶名
        \h:顯示簡寫主機名。如默認主機名「localhost」
        \$:提示符。若是是root用戶會顯示提示符爲「#」,若是是普通用戶會顯示提示符爲「$」
        \w:顯示當前所在目錄的完整名稱
        \W:顯示當前所在目錄的最後一個目錄
        \t:顯示24小時制時間,格式爲「HH:MM:SS」
        \T:顯示12小時制時間,格式爲「HH:MM:SS」
        \d:顯示日期,格式爲「星期 月 日」
        \A:顯示24小時制時間,格式爲「HH:MM」
        \#:執行的第幾個命令

字符串函數:
    ${#str}                獲取字符串的長度
    ${str:num1:num2}    表示從字符串的第num1個字符開始,截取num2個字符。
    ${str/str1/str2}     將第一個str1替換爲str2
    ${str//str1/str2}    將全部的str1替換爲str2

    ${str#*pattern}     刪掉第一個pattern及其左邊的字符串
    ${str##*pattern}     刪掉最後一個pattern及其左邊的字符串
    ${str%pattern*}     刪掉最後一個pattern及其右邊的字符串
    ${str%%pattern*}     刪掉第一個pattern及其右邊的字符串
    說明:#是去掉左邊,%是去掉右邊(tip:鍵盤上#在%的左邊)、單一符號是最小匹配,兩個符號是最大匹配。

數組:
    定義:shell中的數組用括號來表示,元素之間用空格分隔。

    初始化:
        方式一:myArray=(element1 element2 element3)
        方式二:
            myArray[0]=element1;
            myArray[1]=element2;
            myArray[2]=element3;

    獲取數組的元素:
        ${myArray[index]}                獲取下標爲index的數組
        ${myArray} 或 ${myArray[0]}        獲取數組的第一個元素
        ${myArray[*]} 或 ${myArray[@]}     獲取數組的全部元素
        ${#myArray[*]}                    獲取數組的長度

條件判斷:
    概念:表達式用中括號[]或雙中括號[[]]括住,條件表達式與左右方括號之間必須都保留一個空格。
    說明:單中括號中的變量必需要加雙引號,雙中括號中的變量不用加雙引號。
    舉例:[ -z "$pid" ]     VS     [[ -z $pid ]]
    參數:
    邏輯運算符:
        &&    expr1 && expr2     邏輯與(短路與)
        ||    expr1 || expr2     邏輯或(短路或)
        !                    邏輯非
    數值判斷:
        -eq  num1 -eq num2     是否相等
        -ne   num1 -ne num2     是否不相等
        -gt  num1 -gt num2     是否大於
        -ge  num1 -ge num2     是否大於等於
        -lt  num1 -lt num2     是否小於
         -le  num1 -le num2     是否小於等於
    字符串判斷:
        =    str1 = str2  字符串是否相等
        !=   str1 != str2     字符串是否不等
        -n   -n str1         字符串是否非空
        -z   -z str2         字符串是不是空串(長度是否等於0 z:zero)
    文件判斷:
        -e   -e filenaem  文件是否存在
        -r   -r filename  文件是否存在且可讀
        -w   -w filename  文件是否存在且可寫
        -s   -s filename  文件是否存在且長度非0
        -f   -f filename  文件是否存在且是普通文件
        -d   -d filename  文件是否存在且是一個目錄
        -L       -L finename  文件是否存在且是一個連接


循環:
    格式:
        while [ condition ]
        do
            # do something
        done

    無限循環:
        while :
        do
            # do something
        done

    讀文件:
        # 方式一:read經過輸入重定向,把file的第一行全部的內容賦值給變量line,循環體內的命令通常包含對變量line的處理;而後循環處理file的第二行、第三行。。。一直到file的最後一行
        while read line
        do
            # do something
        done < file
        
        # 方式二:command命令的輸出做爲read循環的輸入,這種結構經常使用於處理超過一行的輸出。
        command | while read line
        do
            # do something
        done

        


舉例1:
    #!/usr/bin/env bash

    # 從數據庫中導出的數據,每行數據以製表符分隔
    path=/home/jxn/updateData.tsv 

    # 計數
    count=0;

    echo "--------- start"

    # 按行讀取文件的內容
    while read line
    do
        # 將每行的內容轉換爲數組
        dataArray=(${line});
        firstFieldValue=${dataArray[0]};
        secondFieldValue=${dataArray[1]};

        updatesql="update mytable set firstField=\"${firstFieldValue}\" where secondField=\"${secondFieldValue}\"";
        
        # 執行sql
        echo sql=${updatesql};
        result=`/home/jxn/tools/mysql -h myhost -P 3306 -uroot -p'root!@#' dbName -e "${updatesql}"`;

        # 計數         let count=count+1;         echo "---------result=[${result}] count=[${count}] "     done < ${path}     echo "--------- end"

相關文章
相關標籤/搜索