BASH腳本語法匯集

特殊字符

#        注釋.
;        命令分隔符,可以在同一行上寫兩個或兩個以上的命令.
;;        終止case選項.
.        "點"命令等價于source命令.
         "點"作為文件名的一部分. 如果點放在文件名的開頭的話, 那么這個文件將會成為隱藏文件,
         "點"字符匹配. "點"用來匹配任何的單個字符.
""       部分引用[雙引號, 即"]. "STRING"將會阻止(解釋)STRING中大部分特殊的字符.
''       全引用[單引號, 即']. 'STRING'將會阻止STRING中所有特殊字符的解釋. 這是一種比使用"更強烈的形式.
,        逗號操作符. 逗號操作符鏈接了一系列的算術操作. 雖然里邊所有的內容都被運行了,但只有最后一項被返回.
\        轉義符[反斜線, 即\]. 一種對單字符的引用機制.
/        文件名路徑分隔符[斜線, 即/],也可以用來作為除法算術操作符.
``       命令替換. 已逐漸被$()替代,后者更靈活,如可以嵌套等
:        空命令[冒號, 即:]. 也可以被認為與shell的內建命令true作用相同.
!        取反操作符[嘆號, 即!].
*        通配符[星號, 即*]. *可以用來做文件名匹配,也可以用在正則表達式中, 用來匹配任意個數(shù)(包含0個)的字符.
         算術操作符. 在算術操作符的上下文中, *號表示乘法運算.
         如果要做求冪運算, 使用**, 這是求冪操作符.
?        測試操作符. 在一個特定的表達式中, ?用來測試一個條件的結果.
         在一個雙括號結構中, ?就是C語言的三元操作符.
         在參數(shù)替換表達式中, ?用來測試一個變量是否被set了.
         通配符. ?在通配(globbing)中, 用來做匹配單個字符的"通配符".
$        變量替換(引用變量的內容).
         行結束符. 在正則表達式中, "$"表示行結束符.
${}      參數(shù)替換.
$*       位置參數(shù)
$@       同上.
$?       退出狀態(tài)碼變量. $?變量保存了一個命令, 一個函數(shù), 或者是腳本本身的退出狀態(tài)碼.
$$       進程ID變量. 這個$$變量保存了它所在腳本的進程ID.
()       命令組.
{}       代碼塊,又被稱為內部組, 這個結構事實上創(chuàng)建了一個匿名函數(shù)(一個沒有名字的函數(shù)).
[]       條件測試.數(shù)組元素.用作正則表達式的一部分, 方括號描述一個匹配的字符范圍.
[[]]     測試.
(())     整數(shù)擴展.
>
&>
>&
>>
<
<>       重定向.
<<       用在here document中的重定向.http://doc.linuxpk.com/doc/abs/here-docs.html#HEREDOCREF
<<<      用在here string中的重定向.
<
>        ASCII comparison.
\<
\>       正則表達式中的單詞邊界.
|        管道.
>|       強制重定向(即使設置了noclobber選項 -- 就是-C選項). 這將強制的覆蓋一個現(xiàn)存文件.
||       或-邏輯操作.
&        后臺運行命令.
&&       與-邏輯操作.
-        選項, 前綴.
         用于重定向stdin或stdout[破折號, 即-].
         先前的工作目錄.
         減號. 減號屬于算術操作.
=        等號. 賦值操作,"="也用來做字符串比較操作.
+        加號. 加法算術操作.某些命令內建命令使用+來打開特定的選項, 用-來禁用這些特定的選項.
%        取模. %也是一種模式匹配操作. 在BASH中,%number表示將后臺編號為number的任務調度到前臺執(zhí)行。
~        home目錄[波浪號, 即~].
~+       當前工作目錄. 相當于$PWD內部變量.
~-       先前的工作目錄. 相當于$OLDPWD內部變量.
=~       正則表達式匹配. 這個操作將會在version 3版本的Bash部分進行講解.
^        行首. 在正則表達式中, "^"表示定位到文本行的行首.

文件測試

-e       文件存在.
-f       表示這個文件是一個一般文件.
-d       表示這是一個目錄.
-b       表示這是一個塊設備.
-c       表示這是一個字符設備.
-p       這個文件是一個管道
-s       文件大小不為零.
-L       這是一個符號鏈接
-S       表示這是一個socket
-t       文件(描述符)被關聯(lián)到一個終端設備上.
         這個測試選項一般被用來檢測腳本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是否來自于一個終端.
-r       文件是否具有可讀權限(指的是正在運行這個測試命令的用戶是否具有讀權限)
-w       文件是否具有可寫權限(指的是正在運行這個測試命令的用戶是否具有寫權限)
-x       文件是否具有可執(zhí)行權限(指的是正在運行這個測試命令的用戶是否具有可執(zhí)行權限)
-g       set-group-id(sgid)標記被設置到文件或目錄上
-u       set-user-id (suid)標記被設置到文件上
-k       設置粘貼位
-O       判斷你是否是文件的擁有者
-G       文件的group-id是否與你的相同
-N       從文件上一次被讀取到現(xiàn)在為止, 文件是否被修改過
!        "非" -- 反轉上邊所有測試的結果(如果沒給出條件, 那么返回真).

比較操作

  • 文件比較

    f1 -nt f2
        文件f1比文件f2新
    f1 -ot f2
        文件f1比文件f2舊
    f1 -ef f2
        文件f1和文件f2是相同文件的硬鏈接
    
  • 整數(shù)比較

    -eq        等于
    -ne        不等于
    -gt        大于
    -ge        大于等于
    -lt        小于
    -le        小于等于
    <          小于
    <=         小于等于
    >          大于
    >=         大于等于
    
  • 字符串比較

    =          等于
    ==         等于
    !=         不等號
    <          小于, 按照ASCII字符進行排序
    >          大于, 按照ASCII字符進行排序
    -z         字符串為"null", 意思就是字符串長度為零
    -n         字符串不為"null".
    -l         字符串長度
    
  • 邏輯操作

    -a         邏輯與
    -o         邏輯或
    !          邏輯非
    

參數(shù)替換

  • 參數(shù)擴展

    ${parameter}        與$parameter相同, 在某些上下文中, ${parameter}很少會產生混淆.
    ${parameter-default}    如果變量parameter沒聲明, 那么就使用默認值.
    ${parameter:-default}    如果變量parameter沒設置, 那么就使用默認值.
    ${parameter=default}    如果變量parameter沒聲明, 那么就把它的值設為default.
    ${parameter:=default}    如果變量parameter沒設置, 那么就把它的值設為default.
    ${parameter+value}    如果變量parameter被聲明了, 那么就使用value, 否則就使用null字符串.
    ${parameter:+value}    如果變量parameter被設置了, 那么就使用value, 否則就使用null字符串.
    ${parameter?err_msg}    如果parameter已經(jīng)被聲明, 那么就使用設置的值, 否則打印err_msg錯誤消息.
    ${parameter:?err_msg}    如果parameter已經(jīng)被設置, 那么就使用設置的值, 否則打印err_msg錯誤消息.
    
  • 子串刪除

    ${#var}            字符串長度(變量$var的字符個數(shù)). 對于array來說, ${#array}表示的是數(shù)組中第一個元素的長度.
    ${var#Pattern}        從變量$var的開頭刪除最短匹配$Pattern的子串.
    ${var##Pattern}        從變量$var的開頭刪除最長匹配$Pattern的子串.
    ${var%Pattern}        從變量$var的結尾刪除最短匹配$Pattern的子串.
    ${var%%Pattern}        從變量$var的結尾刪除最長匹配$Pattern的子串.
    
  • 子串替換

    ${var:pos}        變量var從位置pos開始擴展(譯者注: 也就是pos之前的字符都丟棄).
    ${var:pos:len}        變量var從位置pos開始, 并擴展len個字符.
    ${var/Pat/Rep}        使用Rep來替換變量var中第一個匹配Pat的字符串.
    ${var//Pat/Rep}        使用Rep來替換變量var中的所有匹配Pat的字符串.
    ${var/#Pat/Rep}        如果變量var的前綴匹配Pat, 那么就使用Rep來替換匹配到Pat的字符串.
    ${var/%Pat/Rep}        如果變量var的后綴匹配Pat, 那么就使用Rep來替換匹配到Pat的字符串.
    
    ${!varprefix*}
    ${!varprefix@}        匹配所有之前聲明過的, 并且以varprefix開頭的變量.
    

進程替換

>(command)
<(command)

變量定義

declare用法

-r        只讀
-i         整型
-a         數(shù)組
-f         函數(shù)
-x export    這句將會聲明一個變量, 并作為這個腳本的環(huán)境變量被導出.
-x var=$value    允許在聲明變量類型的同時給變量賦值.

控制結構

  • if結構

    if  command
    then
            command
    elif  command
    then
            command
    else
            command
    fi
    例:
    var=70;
    if (($var<60))
    then
        echo "too bad"
    elif (($var>90))
    then
        echo "very good"
    else
        echo "OK"
    fi
    
  • case結構

    case variable in
    value1)
            command1
            ;;
    value2)
            command2
            ;;
    *)
            command3
            ;;
    esac
    例:
    cat << ENDIT
            1)one
            2)two
    ENDIT
    read choice;
    case "$choice" in
    1)
            echo "one"
            ;;
    2)
            echo "two"
            ;;
    *)
            echo "Error"
            ;;
    esac
    
  • for結構

    for variable in world_list
    do
            command
    done
    例:
    for line in ~/*
    do
            echo $line;
    done
    
    for (( i=$loop; i != 0; i-- )); do
            echo "hello"
    done
    
  • while結構

    while command
    do
            command
    done
    例:
    var=1
    while ((var<=30))
    do
            echo $var
            let "var=var+1"
    done
    
  • 函數(shù)使用

    function() {
      ........
    }
    
    $1-9  1-9個參數(shù)
    $#    參數(shù)的數(shù)量
    $@    所有參數(shù),但是所有參數(shù)都是一個字符串
    $*    所有參數(shù),但每個參數(shù)都是一個單獨元素
    
  • 運算命令
    loop=$(((31-16)/8))
    echo $loop
    用$(())命令可以進行數(shù)學計算

  • 重定向
    一般情況下重定向命令只會把內容重定向到一個地方,比如要么到標準輸出,要么到文件。使用tee重定向可以將標準輸出同時重定向到標準輸出和文件中,但是不能得到標準錯誤輸出的內容。下面的方式可以在標準輸出上看到內容,同時將標準輸出和錯誤輸出都記錄到文件中:

    #!/bin/sh
    cmd="/builds/tools/cnrdmk78.sh jsr > /dev/stdout 2>&1"
    eval $cmd | tee aaa
    

    第一句將標準輸出和錯誤輸出全部重新放到標準輸出里面,這樣就可以在屏幕上看到輸出的內容。這里有2個需要注意的地方,首先是整個命令要放進一個變量里(因為要重定向2次),其次是不能用 >& 的方式而必須分開來寫。

    第二句則執(zhí)行上面的重定向命令,然后將輸出放進aaa文件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容