簡介
關(guān)于Shell的學(xué)習(xí)資料,網(wǎng)上已經(jīng)是多不勝數(shù)。本文主要記錄個人在學(xué)習(xí)和使用Shell的過程中零碎的問題、小知識點和相關(guān)資料的索引。主要作用方便個人查閱。@_@
個人常用的Linux命令在線查詢網(wǎng)站:http://man.linuxde.net/
正文
1. #!/bin/bash? ?出現(xiàn)在程序的第一行,#!?指明執(zhí)行該文本的程序為/bin/bash
2. 特殊環(huán)境變量:$0、$n(數(shù)值)、$#、$*、$@、$?、$$? ? ?來源
$0? 當(dāng)前腳本的文件名
$n? ?傳遞給腳本或函數(shù)的參數(shù)。n 是一個數(shù)字,表示第幾個參數(shù)。例如,第一個參數(shù)是$1,第二個參數(shù)是$2。
$#? ?傳遞給腳本或函數(shù)的參數(shù)個數(shù)。
$*? ?傳遞給腳本或函數(shù)的所有參數(shù)。
$@? ?傳遞給腳本或函數(shù)的所有參數(shù)。被雙引號(" ")包含時,與 $* 稍有不同
$?? ?上個命令的退出狀態(tài),或函數(shù)的返回值。
$$? ?當(dāng)前Shell進(jìn)程ID。對于 Shell 腳本,就是這些腳本所在的進(jìn)程ID。
3.?變量引用和替換:來源
${var}? ?變量本來的值
${var:-word}? 如果變量 var 為空或已被刪除(unset),那么返回?word,但不改變?var 的值。
${var:=word}? ?如果變量 var 為空或已被刪除(unset),那么返回 word,并將 var 的值設(shè)置為 word。
${var:?message}? ? 如果變量 var 為空或已被刪除(unset),那么將消息 message 送到標(biāo)準(zhǔn)錯誤輸出,可以用來檢測變量 var 是否可以被正常賦值。若此替換出現(xiàn)在Shell腳本中,那么腳本將停止運行。
${var:+word}? ?如果變量 var 被定義,那么返回 word,但不改變 var 的值。
4.?單引號(' ')字符串和雙引號(" ")字符串的區(qū)別:單引號字符串中不做轉(zhuǎn)義和變量替換,雙引號字符串反之。
5.?命令替換:1) $(command)? ?2) ` command ` (反引號 " ` ")
6.?輸入:?read [options]? var_list
7.?對腳本進(jìn)行語法檢查,不執(zhí)行腳本:bash -n 文件名
執(zhí)行調(diào)試腳本:bash -x 文件名
8.?條件語句格式:注意"_"處為空格
1)格式1:
if_[_expression_]
then
Statement(s) to be executed if expression is true
fi
如果then要和if在同一行需要有 ;
?if_[_expression_] ; then
if
2)格式2:
if_[_expression_]? ; then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
3)?格式3:
if [ expression 1 ] ; then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ] ; then
Statement(s) to be executed if expression 2 is true
else
Statement(s) to be executed if no expression is true
fi
9.?字符串表達(dá)式:注意:使用[ ]命令測試表示式時,在操作數(shù)和操作符或者發(fā)括號的前后都至少要留一個空格。
string1 == string2? ? ?兩個字符串相同為true
string1 !=?string2? ? 兩個字符串不相同為true
-n?string? ? ?字符串不為空,?為true
-z string? ? ? 字符串為空,為true
10.?算術(shù)表達(dá)式:注意:使用[ ]命令測試表示式時,在操作數(shù)和操作符或者發(fā)括號的前后都至少要留一個空格。
exp1 -eq exp2? ? ?==
exp1 -ne exp2? ? ?!=
exp1 -gt exp2? ? ? >
exp1 -ge exp2? ? ?>=
exp1 -lt exp2? ? ? ?<
exp1 -le exp2? ? ? <=
? ? ?! exp1? ? ? ? ? ? ?取反
11.?文件測試表達(dá)式??注意:使用[ ]命令測試表示式時,在操作數(shù)和操作符或者發(fā)括號的前后都至少要留一個空格。
-d file? ? 若file為一個目錄,為true
-e file? ? 若file存在,為true
-f file? ? ?若file為一個普通文件,為true
-g file? ? 若file的SGID位被設(shè)置,為true
-r file? ? ? 若file可讀,為true
-s file? ? ?若file長度不為0,為true
-u file? ? ?若file的SUID位為被設(shè)置,為true
-w file? ? 若file可寫,為true
-x file? ? ? 若file可執(zhí)行,為true
12.?循環(huán)語句:?for? while? until
13.case esac語句:?參考
14.break和continue :?參考
15.?exit?n:結(jié)束運行。n為退出碼,即該腳本結(jié)束后$?的值。
約定俗成的退出碼:0表示成功,1-125為錯誤代碼,126?文件不可執(zhí)行,127命令未找到,128以及以上出現(xiàn)一個信號
16.?數(shù)值處理:bash變量的值是以字符串方式存儲的,若要進(jìn)行算術(shù)和邏輯操作,需要先轉(zhuǎn)為整數(shù),再將結(jié)果轉(zhuǎn)為字符串。
1)let命令 :若表達(dá)式中有空格或特殊字符,應(yīng)將表達(dá)式括在""中。
let "x = 6" "y = 9"? "z = 16"? ? #定義變量,并賦值
let t=x+y? ? ? ?
let?A=2**x? ?B=y*z? ? ? ? ? ?#2**x?表示2的x次方
2)shell擴(kuò)展$(( exp ))? ?
echo "There are $((60*60*24*365)) seconds in a non-leap year"
There are 31536000 seconds in a non-leap year
3)expr命令:在我的lElementaryOS虛擬機(jī)不管用,不太清什么情況
17.數(shù)組
bash支持一維數(shù)組。數(shù)組長度沒有限制,元素不必連續(xù)
name=(value1?value2 ... valueN )? ?#形式
ns=(max san [6]=zhang [25]=wang)? ?#定義一個數(shù)組${ns[0]} =?max、${ ns[1]} = san、${ns[6]}=zhang、? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #${ns[25]}=wang,其他位未賦值
ns[@]和ns[*]?表示整個數(shù)組
函數(shù)被調(diào)用時,在函數(shù)體內(nèi),$0、$n、$#、$*、$@會被函數(shù)實參替換,直到函數(shù)執(zhí)行完。
通過return命令可讓函數(shù)返回數(shù)值。一般用來表示函數(shù)執(zhí)行成功與否,0表示成功,其他值表示失敗。
函數(shù)體中用local可定義局部變量