()
命令組.在括號中的命令列表, 將會(huì )作為一個(gè)子shell來(lái)運行.
在括號中的變量,由于是在子shell中,所以對于腳本剩下的部分是不可用的. 父進(jìn)程, 也就是腳本本身, 將不能夠讀取在子進(jìn)程中創(chuàng )建的變量, 也就是在子shell中創(chuàng )建的變量.
(cmd1;cmd2;cmd3)
初始化數組.
Array=(element1 element2 element3)
$(...)
相當于`...`命令,返回括號中命令執行的結果
let命令
(( ))
(( ... ))結構可以用來(lái)計算并測試算術(shù)表達式的結果. 退出狀態(tài)將會(huì )與[ ... ]結構完全相反!還可應用到c風(fēng)格的for,while循環(huán)語(yǔ)句,(( )) 中,所有的變量(加不加$無(wú)所謂)都是數值。
$((...))結構的表達式是C風(fēng)格的表達式,其返回的結果是表達式值,其中變量引用可不用‘$’(當然也可以)
for((...;...;...))
do
cmd
done
while ((...))
do
cmd
done
比較操作符
<
小于
(("$a" < "$b"))
<=
小于等于
(("$a" <= "$b"))
>
大于
(("$a" > "$b"))
>=
大于等于
(("$a" >= "$b"))
(( 0 ))
echo "Exit status of \"(( 0 ))\" is $?." # 1
(( 1 ))
echo "Exit status of \"(( 1 ))\" is $?." # 0
(( 5 > 4 )) # 真
echo "Exit status of \"(( 5 > 4 ))\" is $?." # 0
(( 5 > 9 )) # 假
echo "Exit status of \"(( 5 > 9 ))\" is $?." # 1
(( 5 - 5 )) # 0
echo "Exit status of \"(( 5 - 5 ))\" is $?." # 1
(( 5 / 4 )) # 除法也可以.
echo "Exit status of \"(( 5 / 4 ))\" is $?." # 0
(( 1 / 2 )) # 除法的計算結果 < 1.
echo "Exit status of \"(( 1 / 2 ))\" is $?." # 截取之后的結果為 0.
# 1
(( 1 / 0 )) 2>/dev/null # 除數為0, 非法計算.
#
echo "Exit status of \"(( 1 / 0 ))\" is $?." # 1
for ((a=1; a <= LIMIT ; a++)) # 雙圓括號, 并且"LIMIT"變量前面沒(méi)有"$".
do
echo -n "$a "
done
while (( a <= LIMIT )) # 雙圓括號, 變量前邊沒(méi)有"$".
do
echo -n "$a "
((a += 1)) # let "a+=1"
done
a=2
b=$(($a*4)) #a=2 b=8
c=$((a*3)) #a=2 c=6
[ ]
條件測試表達式放在[ ]中. 值得注意的是[是shell內建test命令的一部分, 并不是/usr/bin/test中的外部命令的一個(gè)鏈接.
文件測試操作符(如果下面的條件成立將會(huì )返回真)
-e
文件存在(推薦用)
-a
文件存在(不推薦用)
-f
表示這個(gè)文件是一個(gè)一般文件(并不是目錄或者設備文件)
-s
文件大小不為零
-d
表示這是一個(gè)目錄
-b
表示這是一個(gè)塊設備(軟盤(pán), 光驅, 等等.)
-c
表示這是一個(gè)字符設備(鍵盤(pán), modem, 聲卡, 等等.)
-p
這個(gè)文件是一個(gè)管道
-h
這是一個(gè)符號鏈接
-L
這是一個(gè)符號鏈接
-S
表示這是一個(gè)socket
-t
文件(描述符)被關(guān)聯(lián)到一個(gè)終端設備上
這個(gè)測試選項一般被用來(lái)檢測腳本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是否來(lái)自于一個(gè)終端.
-r
文件是否具有可讀權限(指的是正在運行這個(gè)測試命令的用戶(hù)是否具有讀權限)
-w
文件是否具有可寫(xiě)權限(指的是正在運行這個(gè)測試命令的用戶(hù)是否具有寫(xiě)權限)
-x
文件是否具有可執行權限(指的是正在運行這個(gè)測試命令的用戶(hù)是否具有可執行權限)
-g
set-group-id(sgid)標記被設置到文件或目錄上
如果目錄具有sgid標記的話(huà), 那么在這個(gè)目錄下所創(chuàng )建的文件將屬于擁有這個(gè)目錄的用戶(hù)組, 而不必是創(chuàng )建這個(gè)文件的用戶(hù)組. 這個(gè)特性對于在一個(gè)工作組中共享目錄非常有用.
-u
set-user-id (suid)標記被設置到文件上
如果一個(gè)root用戶(hù)所擁有的二進(jìn)制可執行文件設置了set-user-id標記位的話(huà), 那么普通用戶(hù)也會(huì )以root權限來(lái)運行這個(gè)文件. [1] 這對于需要訪(fǎng)問(wèn)系統硬件的執行程序(比如pppd和cdrecord)非常有用. 如果沒(méi)有suid標志的話(huà), 這些二進(jìn)制執行程序是不能夠被非root用戶(hù)調用的.
-rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppd
對于設置了suid標志的文件, 在它的權限列中將會(huì )以s表示.
-k
設置粘貼位
對于"粘貼位"的一般了解, save-text-mode標志是一個(gè)文件權限的特殊類(lèi)型. 如果文件設置了這個(gè)標志, 那么這個(gè)文件將會(huì )被保存到緩存中, 這樣可以提高訪(fǎng)問(wèn)速度. [2] 粘貼位如果設置在目錄中, 那么它將限制寫(xiě)權限. 對于設置了粘貼位的文件或目錄, 在它們的權限標記列中將會(huì )顯示t.
drwxrwxrwt 7 root 1024 May 19 21:26 tmp/
如果用戶(hù)并不擁有這個(gè)設置了粘貼位的目錄, 但是他在這個(gè)目錄下具有寫(xiě)權限, 那么這個(gè)用戶(hù)只能在這個(gè)目錄下刪除自己所擁有的文件. 這將有效的防止用戶(hù)在一個(gè)公共目錄中不慎覆蓋或者刪除別人的文件. 比如說(shuō)/tmp目錄. (當然, 目錄的所有者或者root用戶(hù)可以隨意刪除或重命名其中的文件.)
-O
判斷你是否是文件的擁有者
-G
文件的group-id是否與你的相同
-N
從文件上一次被讀取到現在為止, 文件是否被修改過(guò)
f1 -nt f2
文件f1比文件f2新
f1 -ot f2
文件f1比文件f2舊
f1 -ef f2
文件f1和文件f2是相同文件的硬鏈接
!
"非" -- 反轉上邊所有測試的結果(如果沒(méi)給出條件, 那么返回真).
比較操作符
整數比較
-eq
等于
-ne
不等于
-gt
大于
-ge
大于等于
-lt
小于
-le
小于等于
字符串比較
=
等于
==
等于,與=等價(jià).(==比較操作符在雙中括號對和單中括號對中的行為是不同的)
[[ $a == z* ]] # 如果$a以"z"開(kāi)頭(模式匹配)那么結果將為真
[[ $a == "z*" ]] # 如果$a與z*相等(就是字面意思完全一樣), 那么結果為真.
[ $a == z* ] # 文件擴展匹配(file globbing)和單詞分割有效.
[ "$a" == "z*" ] # 如果$a與z*相等(就是字面意思完全一樣), 那么結果為真.
!=
不等號(這個(gè)操作符將在[[ ... ]]結構中使用模式匹配)
<
小于, 按照ASCII字符進(jìn)行排序(注意"<"使用在[ ]結構中的時(shí)候需要被轉義)
>
大于, 按照ASCII字符進(jìn)行排序(注意">"使用在[ ]結構中的時(shí)候需要被轉義)
-z
字符串為"null", 意思就是字符串長(cháng)度為零
-n
字符串不為"null".
-a
邏輯與
-o
邏輯或
{xxx,yyy,zzz,...}
大括號擴展.
echo {1..20}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
cat {file1,file2,file3} > combined_file
# 把file1, file2, file3連接在一起, 并且重定向到combined_file中.
cp file22.{txt,backup}
# 拷貝"file22.txt"到"file22.backup"中
在大括號中, 不允許有空白, 除非這個(gè)空白被引用或轉義.
echo {file1,file2}\ :{\ A," B",' C'}
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
代碼塊
這個(gè)結構事實(shí)上創(chuàng )建了一個(gè)匿名函數(一個(gè)沒(méi)有名字的函數). 然而, 與"標準"函數不同的是, 在其中聲明的變量,對于腳本其他部分的代碼來(lái)說(shuō)還是可見(jiàn)的(除了用declare,typeset命令聲明的變量)
()會(huì )開(kāi)啟一個(gè)新的子shell,{}不會(huì )開(kāi)啟一個(gè)新的子shell
(())常用于算術(shù)運算比較,[[]]常用于字符串的比較.
$()返回括號中命令執行的結果
$(())返回的結果是括號中表達式值
${ }參數替換與擴展
參數替換
${var}
${var}=$var
${var:-default} ${var-default}
如果var未set,那么就是用default.兩者之間不同只有當var為空變量時(shí),前者為default,后者為空.
${var:=default} ${var=default}
如果var未set,那么就設置default.兩者之間不同只有當var為空變量時(shí),前者設置為default,后者設置為空.
${var:+default} ${var+default}
如果var被set,就是用default.未set,就使用null字符串.兩者之間不同只有當var為空變量時(shí),前者為null字符串,后者為default.
上面三種參數替換中,第二種使用后變量的值被改變.
參數替換擴展
${#var} ${#array}
字符串長(cháng)度或數組第一個(gè)元素的字符串長(cháng)度
例外:
${#*}、${#@}指位置參數的個(gè)數.
${#array},$[#array[@]}指數組元素的個(gè)數
${var#pattern} ${var##pattern}
從var開(kāi)頭刪除最近或最遠匹配pattern的子串.
${var%pattern} ${var%%pattern}
從var結尾刪除最近或最遠匹配pattern的子串.
${var:pos}
變量var從位置pos開(kāi)始擴展.
${var:pos:len}
從位置pos開(kāi)始,并擴展len長(cháng)度個(gè)字符
${var/pattern/replacement} ${var//pattern/replacement}
使用replacement來(lái)替換var中的第一個(gè)或所有pattern的匹配.
${var/#pattern/replacement}
如果var的前綴匹配到了pattern,那么就用replacement來(lái)替換pattern.
${var/%pattern/replacement}
如果var的后綴匹配到了pattern,那么就用replacement來(lái)替換pattern.
${!varprefix*} ${!varprefix@}
前邊所有聲明過(guò)的,以varprefix為前綴的變量名.
[[]]就是條件表達式,在bash中,字符串比較用 > < != == <= >= 只是在[]中 < >需要轉義;對于數值比較.用 -lt -le -eq -ge -gt 來(lái)比較,與[[]]中表達不太一樣,在[ ] 中的 < > 需要用轉義 \< \>,如果有多個(gè)表達式,在[[ ]] 中用 && || 來(lái)組合,而[] 中是用 -a -o 來(lái)組合
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。