1. 用set命令設置bash的選項:下面爲set主要選項的列表及其表述:選項名開關縮寫描述allexport-a打開此開關,全部變量都自動輸出給子Shell。noclobber-C防止重定向時文件被覆蓋。noglob-d在路徑和文件名中,關閉通配符。linux
#打開該選項/> set -o allexport #等同於set -a#關閉該選項/> set +o allexport #等同於set +a#列出當前全部選項的當前值。shell
/> set -oexpress
allexport off數組
braceexpand onbash
emacs on服務器
errexit offapp
errtrace off函數
functrace off測試
hashall onui
histexpand on
... .../> set -o noclobber #打開noclobber選項,防止在重定向時原有文件被覆蓋。/> date > outfile #經過date命令先生成一個文件outfile。/> ls > outfile #將ls命令的輸出重定向到該文件outfile,shell將提示不能覆蓋已經存在的文件。
-bash: outfile: cannot overwrite existing file/> set +o noclobber #關閉noclobber選項。/> ls > outfile #從新將ls的輸出重定向到outfile,成功。2. 變量:設置局部變量:/> name="stephen liu" #注意等號兩邊不要有空格,若是變量值之間存在空格,則須要用雙引號括起/> echo $namestephen liu/> name= #將變量設置爲空時,等號後面也不要有空格,直接回車便可。/> echo $name #name變量爲空,所以echo不會有任何輸出。
注意:以上變量的聲明方式都可替換爲declare variable=value的形式。/> declare name="stephen liu"/> readonly name #將name變量設置爲只讀。/> echo $namestephen liu/> name="my wife" #若是針對只讀變量從新賦值,將報錯,提示name是隻讀變量。
-bash: name: readonly variable/> unset name #若是unset只讀變量,將一樣報錯,提示不能unset只讀變量。
-bash: unset: name: cannot unset: readonly variable設置全局/環境變量:在當前Shell中建立的全局/環境變量能夠直接傳遞給它全部的子Shell,當前建立環境變量的Shell被稱爲夫Shell。/> export allname=john #利用export命令,將其後聲明的變量置爲環境變量/> bash #啓動一個新的子Shell/> echo $allname #在子Shell中echo變量$allname,發現夫Shell中設置的值被傳遞到子Shell
john/> declare -x allname2=peter #這裏的功能和結果都是和上面的命令相同,只是利用declare -x命令設置環境變量
/> bash/> echo $allname2peter
下面的列表將給出經常使用的內置Shell環境變量:變量名含義BASH表示bash命令的完整路徑名。ENV在啓動新bash shell時執行的環境文件名。HOME主目錄。LANG本地化語言。PATH命令搜索路徑,彼此之間冒號分隔。PPID父進程PID。PWD當前工做目錄,用cd命令設置。3. echo命令:該命令主要用於將其參數打印到標準輸出。其中-e選項使得echo命令能夠無限制地使用轉義序列控制輸出的效果。下面的列表給出經常使用的轉義序列。轉義序列功能\c不換行打印\n換行\t製表符\\反斜槓
echo還提供了一個經常使用的-n選項,其功能不輸出換行符。/> echo The username is $LOGNAMEThe username is stephen
#下面命令的輸出中的「/>」表示命令行提示符。/> echo -e "\tHello World\c"Hello World />/> echo -n "Hello World"Hello World />4. printf命令:該命令和C語言中的printf函數的功能相同,都用用來格式化輸出的。格式包括字符串自己和描述打印效果的字符。定義格式的方法和C語言也是徹底同樣的,即在%後面跟一個說明符,如%f表示後面是一個浮點數,%d表示一個整數。printf命令也一樣支持轉義序列符,其經常使用轉義序列以下:轉義序列功能\c不換行打印\n換行\t製表符\\反斜槓\"雙引號
其經常使用的格式化說明符列表以下:說明符描述%cASCII字符%d,%i十進制整數%f浮點格式%o不帶正負號的八進制值%s字符串%u不帶正負號的十進制值%x不帶正負號的十六進制值,其中使用a-f表示10-15%X不帶正負號的十六進制值,其中使用A-F表示10-15%%表示%自己
下面是printf的一些經常使用使用方式:/> printf "The number is %.2f.\n" 100 這裏.2f表示保留小數點後兩位
The number is 100.00.
#%-20s表示一個左對齊、寬度爲20個字符字符串格式,不足20個字符,右側補充相應數量的空格符。
#%-15s表示一個左對齊、寬度爲15個字符字符串格式。
#%10.2f表示右對齊、10個字符長度的浮點數,其中一個是小數點,小數點後面保留兩位。/> printf "%-20s%-15s%10.2f\n" "Stephen" "Liu" 35Stephen Liu 35.00
#%10s表示右對齊、寬度爲10的字符串,如不足10個字符,左側補充相應數量的空格符。/> printf "|%10s|\n" hello| hello|
在printf中還有一些經常使用的標誌符,如上面例子中的符號(-),這裏咱們在介紹一個比較經常使用的標識符"#"
#若是#標誌和%x/%X搭配使用,在輸出十六進制數字時,前面會加0x/0X前綴。/> printf "%x %#x\n" 15 15f 0xf5. 變量替換運算符:bash中提供了一組能夠同時檢驗和修改變量的特定修改符。這些修改符提供了一個快捷的方法來檢驗變量是否是被設置過,並把輸出結果輸出到一個變量中,見下表:修改符描述用途${variable:-word}如variable被設置且非空,則返回該值,不然返回word,變量值不變。如變量未定義,返回默認值。${variable-word}如variable未被設置,則返回word,變量值不變,若是設置變量,則返回變量值,即便變量的值爲空值。如變量未設置,返回默認值。${variable:=word}如variable被設置且非空,則返回該值,不然設置變量爲word,同時返回word。若是變量未定義,則設置其爲默認值。${variable=word}如variable未設置,則設置變量爲word,同時返回word,若是variable被設置且爲空,將返回空值,同時variable不變。不然返回variable值,同時variable不變。若是變量未設置,則設置其爲默認值。${variable:+word}如variable被設置且非空,則返回word,不然返回null,變量值不變。用於測試變量是否存在。${variable+word}如variable被設置(即便是空值),則返回word,不然返回空。用於測試變量是否設置。${variable:?word}如variable被設置且非空,則返回該值,不然顯示word,而後退出Shell。若是word爲空,打印"parameter null or not set"爲了捕捉因爲變量未定義所致使的錯誤。${variable:offset}從variable的offset位置開始取,直到末尾。 ${variable:offset:length}從variable的offset位置開始取length個字符。
#${variable:-word}的示例,其C語言表示形式爲:
# if (NULL == variable)
# return word;
# else
# return $variable;/> unset var_name #將變量var_name置爲空。
/> var_name=/> echo ${var_name:-NewValue} #var_name爲空,所以返回NewValue
NewValue/> echo $var_name #var_name的值未變化,仍然爲空。/> var_name=OldValue #給var_name賦值。/> echo ${var_name:-NewValue} #var_name非空,所以返回var_name的原有值。
OldValue/> echo $var_name #var_name的值未變化,仍然OldValue。
OldValue
#${variable-word}的示例,其僞碼錶示形式爲:
# if (variable is NOT set)
# return word;
# else
# return $variable;/> unset var_name #取消該變量var_name的設置。/> echo ${var_name-NewValue} #var_name爲空,所以返回NewValue
NewValue/> echo $var_name #var_name的值未變化,仍然爲空。/> var_name=OldValue #給var_name賦值,即使執行var_name=,其結果也是同樣。/> echo ${var_name-NewValue} #var_name非空,所以返回var_name的原有值。
OldValue/> echo $var_name #var_name的值未變化,仍然OldValue。
OldValue
#${variable:=word}的示例,其C語言表示形式爲:
# if (NULL == variable) {
# variable=world;
# return word;
# } else {
# return $variable;
# }/> unset var_name #將變量var_name置爲空。/> var_name=/> echo ${var_name:=NewValue} #var_name爲空,設置變量爲NewValue同時返回NewValue。
NewValue/> echo $var_name #var_name的值已經被設置爲NewValue。
NewValue/> var_name=OldValue #給var_name賦值。/> echo ${var_name:=NewValue} #var_name非空,所以返回var_name的原有值。
OldValue/> echo $var_name #var_name的值未變化,仍然OldValue。
OldValue
#${variable=word}的示例,其僞碼錶示形式爲:
# if (variable is NOT set) {
# variable=world;
# return word;
# } else if (variable == NULL) {
# return $variable; //variable is NULL
# } else {
# return $variable;
# }/> unset var_name #取消該變量var_name的設置。/> echo ${var_name=NewValue} #var_name未被設置,設置變量爲NewValue同時返回NewValue。
NewValue/> echo $var_name #var_name的值已經被設置爲NewValue。
NewValue/> var_name= #設置變量var_name,並給該變量賦空值。/> echo ${var_name=NewValue} #var_name被設置,且爲空值,返回var_name的原有空值。/> echo $var_name #var_name的值未變化,仍未空值。/> var_name=OldValue #給var_name賦值。/> echo ${var_name=NewValue} #var_name非空,所以返回var_name的原有值。
OldValue/> echo $var_name #var_name的值未變化,仍然OldValue。
OldValue
#${variable:+word}的示例,其C語言表示形式爲:
# if (NULL != variable)
# return word;
# else
# return $variable;/> var_name=OldValue #設置變量var_name,其值爲非空。/> echo ${var_name:+NewValue} #因爲var_name有值,所以返回NewValue
NewValue/> echo $var_name #var_name的值仍然爲遠之OldValue
OldValue/> unset var_name #將var_name置爲空值。/> var_name=/> echo ${var_name:+NewValue} #因爲var_name爲空,所以返回null。/> echo $var_name #var_name仍然保持原有的空值。
#${variable+word}的示例,其僞碼錶示形式爲:
# if (variable is set)
# return word;
# else
# return $variable;/> var_name=OldValue #設置變量var_name,其值爲非空。/> echo ${var_name+NewValue} #因爲var_name有值,所以返回NewValue
NewValue/> echo $var_name #var_name的值仍然爲遠之OldValue
OldValue/> unset var_name #取消對變量var_name的設置。/> echo ${var_name+NewValue} #返回空值。/> echo $var_name #var_name仍未被設置。
#${variable:?word}的示例,其C語言表示形式爲:
# if (NULL != variable) {
# return variable;
# } else {
# if (NULL != word)
# return "variable : word";
# else
# return "parameter null or not set";
# }/> var_name=OldValue #設置變量var_name,其值爲非空。/> echo ${var_name:?NewValue} #因爲var_name有值,所以返回變量的原有值
OldValue/> unset var_name #將var_name置爲空值。/> var_name=/> echo ${var_name:?NewValue} #因爲var_name爲空,所以返回word。
-bash: var_name: NewValue/> echo $var_name #var_name仍然保持原有的空值。/> echo ${var_name:?} #若是word爲空,返回下面的輸出。
-bash: var_name: parameter null or not set
#${variable:offset}示例:/> var_name=notebook/> echo ${var_name:2}tebook/> echo ${var_name:0} #若是offset爲0,則取var_name的所有值。
notebook
${variable:offset:length}示例:/> var_name=notebook/> echo ${var_name:0:4}note/> echo ${var_name:4:4}book6. 變量模式匹配運算符:Shell中還提供了一組模式匹配運算符,見下表:運算符替換${variable#pattern}若是模式匹配變量值的開頭,則刪除匹配的最短部分,並返回剩下的部分,變量原值不變。${variable##pattern}若是模式匹配變量值的開頭,則刪除匹配的最長部分,並返回剩下的部分,變量原值不變。${variable%pattern}若是模式匹配變量值的結尾,則刪除匹配的最短部分,並返回剩下的部分,變量原值不變。${variable%%pattern}若是模式匹配變量值的結尾,則刪除匹配的最長部分,並返回剩下的部分,變量原值不變。${#variable}返回變量中字母的數量。
#${variable#pattern}示例:/> pathname="/home/stephen/mycode/test.h"/> echo ${pathname#/home} #變量pathname開始處匹配/home的最短部分被刪除。
/stephen/mycode/test.h/> echo $pathname #pathname的原值不變。
/home/stephen/mycode/test.h
#${variable##pattern}示例:/> pathname="/home/stephen/mycode/test.h"/> echo ${pathname##*/} #變量pathname開始處匹配*/的最長部分被刪除,*表示任意字符。
test.h/> echo $pathname #pathname的原值不變。
/home/stephen/mycode/test.h
#${variable%pattern}示例:/> pathname="/home/stephen/mycode/test.h"/> echo ${pathname%/*} #變量pathname結尾處匹配/*的最短部分被刪除。
/home/stephen/mycode/> echo $pathname #pathname的原值不變。
/home/stephen/mycode/test.h
#${variable%%pattern}示例:/> pathname="/home/stephen/mycode/test.h"/> echo ${pathname%%/*} #變量pathname結尾處匹配/*的最長部分被刪除,這裏全部字符串均被刪除。/> echo $pathname #pathname的原值不變。
/home/stephen/mycode/test.h
#${#variable}示例:/> name="stephen liu"/> echo ${#name}117. Shell中的內置變量:Shell中提供了一些以$開頭的內置變量,見下表:變量名描述$?表示Shell命令的返回值$$表示當前Shell的pid$-表示當前Shell的命令行選項$!最後一個放入後臺做業的PID值$0表示腳本的名字$1--$9表示腳本的第一到九個參數${10}表示腳本的第十個參數$#表示參數的個數$*,$@表示全部的參數,有雙引號時除外,"$*"表示賦值到一個變量,"$@"表示賦值到多個。
全部的內置變量都比較容易理解,所以這裏僅給出$*和$@的區別用法:/> set 'apple pie' pears peaches/> for i in $*> do> echo $i> doneapple
pie
pears
peaches/> set 'apple pie' pears peaches/> for i in $@> do> echo $i> doneapple
pie
pears
peaches/> set 'apple pie' pears peaches/> for i in "$*" #將全部參數變量視爲一個> do> echo $i> doneapple pie pears peaches/> set 'apple pie' pears peaches/> for i in "$@"> do> echo $i> doneapple pie #這裏的單引號將兩個單詞合成一個.
pears
peaches8. 引用:Shell中提供三種引用字符,分別是:反斜槓、單引號和雙引號,它們可使Shell中全部元字符失去其特殊功能,而還原其本意。見如下元字符列表:元字符描述;命令分隔符&後臺處理Shell命令()命令組,建立一個子Shell{}命令組,可是不建立子Shell|管道< >輸入輸出重定向$變量前綴*[]?用於文件名擴展的Shell通配符
注:單引號和雙引號惟一的區別就是,雙引號內能夠包含變量和命令替換,而單引號則不會解釋這些,見以下示例:
/> name=Stephen/> echo "Hi $name, I'm glad to meet you! " #name變量被替換
Hi Stephen, I'm glad to meet you!/> echo 'Hi $name, I am glad to meet you! ' #name變量沒有被替換
Hi $name, I am glad to meet you!/> echo "Hey $name, the time is $(date)" #name變量和date命令均被替換
Hey Stephen, the time is Fri Nov 18 16:27:31 CST 2011/> echo 'Hey $name, the time is $(date)'Hey $name, the time is $(date) #name變量和date命令均未被替換9. 命令替換:一樣咱們須要把命令的輸出結果賦值給一個變量或者須要用字符串替換變量的輸出結果時,咱們可使用變量替換。在Shell中,一般使用反引號的方法進行命令替換。/> d=`date` #將date命令的執行結果賦值給d變量。
/> echo $d
Fri Nov 18 16:35:28 CST 2011/> pwd/home/stephen/> echo `basename \`pwd\`` #基於反引號的命令替換是可嵌入的,可是嵌入命令的反引號須要使用反斜槓轉義。
stephen
除了反引號能夠用於命令替換,這裏咱們也可使用$(command)形式用於命令替換。/> d=$(date)/> echo $dFri Nov 18 16:42:33 CST 2011/> dirname="$(basename $(pwd))" #和以前的反引號同樣,該方式也支持嵌套。/> echo $dirnamestephen10. 數學擴展:Shell中提供了兩種計算數學表達式的格式:$[ expression ]和$(( expression ))。/> echo $[5+4-2]7/> echo $[5+2*3]11/> echo $((5+4-2))7/> echo $((5+2*3))11
事實上,咱們也能夠在Shell中聲明數值型的變量,這須要在declare命令的後面添加-i選項,如:/> declare -i num/> num=5+5 #注意在賦值的過程當中,全部的符號之間均沒有空格,若是須要空格,須要在表達式的外面加雙引號/> echo $num #若是沒有聲明declare -i num,該命令將返回5+5
10/> num="5 * 5"/> echo $num25/> declare strnum/> strnum=5+5/> echo $strnum #因爲並未將strnum聲明爲數值型,所以該輸出將按字符串方式處理。
5+5
Shell還容許咱們以不一樣進制的方式顯示數值型變量的輸出結果,其格式爲:進制+#+變量。/> declare -i x=017 #017其格式爲八進制格式/> echo $x #缺省是十進制
15/> x=2#101 #二進制/> echo $x5/> x=8#17 #八進制/> echo $x15/> x=16#b #十六進制/> echo $x11
在Shell中還提供了一個內置命令let,專門用於計算數學運算的,見以下示例:/> let i=5/> let i=i+1/> echo $i6/> let "i = i + 2"/> echo $i8/> let "i+=1"/> echo $i911. 數組:Shell中提供了建立一維數組的能力,你能夠把一串數字、名字或者文件放在一個變量中。使用declare的-a選項便可建立它們,或者在變量後面增長下標操做符直接建立。和不少其它開發語言同樣,Shell中的數組也是0開始的,然而不一樣的是Shell中數組的下標是能夠不連續的。獲取數組中某個元素的語法格式爲: ${arrayname[index]}。見以下示例:/> declare -a friends #聲明一個數組變量/> friends=(sheryl peter louise) #給數組變量賦值/> echo ${friends[0]} #經過數組下標的方式訪問數組的元素
sheryl/> echo ${friends[1]}peter/> echo ${friends[2]}louise/> echo ${friends[*]} #下標中星號表示全部元素。
shery1 peter louise
# ${#array[*]}表示數組中元素的數量,而${#friend[0]}則表示第一個元素的長度。/> echo ${#friends[*]}3/> unset friends #unset array清空整個數組,unset array[index]僅清空指定下標的元素。/> x[3]=100/> echo ${x[*]}100/> echo ${x[0]} #0下標的元素並無被賦值過,由於輸出爲空。/> echo ${x[3]}100/> states=(ME [3]=CA [2]=CT) #ME的下標爲0。/> echo ${states[0]}ME/> echo ${states[1]} #數組下標爲1的位置沒有被賦值過,所以沒有輸出。/> echo ${states[2]}CT/> echo ${states[3]}CA12. 函數:和C語言同樣,Shell中也能夠建立本身的自定義函數。其格式以下:
function_name () { commands; commands; }
function function_name { commands; commands; }
function function_name () { commands; commands; }
函數的參數在函數內是以$[0-9]、${10}...,這種局部變量的方式來訪問的。見下面的示例:
#函數的左花括號和命令之間必須有至少一個空格。每一個命令的後面都要有一個分號,即使是最後一個命令/> function greet { echo "Hello $LOGNAME, today is $(date)"; }#此時函數已經駐留在當前的bash shell中,所以使用函數效率更高。/> greetHello root, today is Fri Nov 18 20:45:10 CST 2011/> greet() { echo "Hello $LOGNAME, today is $(date)"; }/> greetHello root, today is Fri Nov 18 20:46:40 CST 2011
#welcome函數內部使用了函數參數。/> function welcome { echo "Hi $1 and $2"; }/> welcome stephen janeHi stephen and jane
#declare -F選項將列出當前Shell中駐留的函數/> declare -Fdeclare -f greet
declare -f welcome
#清空指定的函數,使其不在Shell中駐留。/> unset -f welcome13. 重定向:下面的列表爲Shell中支持的從新定向操做符。操做符功能<從新定向輸入>從新定向輸出>>追加輸出2>從新定向錯誤&>從新定向錯誤和輸出>&從新定向錯誤和輸出2>&1從新定向錯誤到標準輸出1>&2從新定向標準輸出到錯誤>|從新定向輸出的時候覆蓋noclobber選項
#find命令將搜索結果輸出到foundit文件,把錯誤信息輸出到/dev/null/> find . -name "*.c" -print > foundit 2> /dev/null#將find命令的搜索結果和錯誤信息均輸出到foundit文件中。/> find . -name "*.c" -print >& foundit#同上。/> find . -name "*.c" -print > foundit 2>&1#echo命令先將錯誤輸出到errfile,再把信息發送到標準錯誤,該信息標準錯誤與標準輸出合併在一塊兒(errfile中)。/> echo "File needs an argument" 2> errfile 1>&2/> cat errfileFile needs an argument