特殊字符
# 注釋.
; 命令分隔符,可以在同一行上寫兩個或兩個以上的命令.
;; 終止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文件