時間:2017年08月28日星期一
說明:本文部份內容均摘取自書籍《Linux命令行與shell腳本編程大全》,版權歸原做者全部。《Linux命令行與shell腳本編程大全》(第三版)第十一章學習總結shell
本章內容express
使用多個命令 建立腳本文件 顯示消息 使用變量 輸入輸出重定向 管道 數據運算 退出腳本
shell腳本的關鍵在於輸入多個命令並處理每一個命令的結果,甚至須要將一個命令的結果傳給另外一個命令。shell可讓你將多個命令串起來,一次執行完成。若是要兩個命令一塊兒運行,能夠把它們放在同一行中,彼此用分號隔開。最大命令行字符數不超過255個字符。編程
命令演示:date ; who 命令說明:先執行date顯示當前日期和時間,而後執行who顯示當前是誰登錄到了系統上
使用這種方式,在每次運行以前,都必須在命令提示符下輸入整個命令。能夠將這些命令組合成一個簡單的文本文件,這樣就不須要在命令行中手動輸入了。vim
命令演示:vim test1 命令說明:建立一個名爲test1的文件
在建立shell腳本文件時,必須在文件的第一行指定要使用的shell,格式爲數組
#!/bin/bash
在一般的shell腳本中,井號(#)用做註釋行。shell並不會處理shell腳本中額註釋行。但shell腳本文件的第一行是個例外,#後面的驚歎號會告訴shell用哪一個shell來運行腳本。bash
使用vim編輯test1並保存函數
#!/bin/bash # my shell script date who
命令演示:echo $PATH 命令說明:查看PATH環境變量 命令演示:chmod u+x test1 命令說明:經過chmod命令賦予文件屬主執行文件的權限 命令演示:./test1 命令說明:運行在當前目錄下的test1腳本
命令格式:echo "msg" 命令說明:顯示 echo後面的文本字符串msg 命令格式:echo -n "msg" 命令說明:顯示echo後面的文本字符串且不換行
修改test1以下保存並運行查看效果學習
#!/bin/bash # my shell script echo -n The time and date are: date echo "Let's see who's logged init the system:" who
命令演示:set 命令說明:顯示當前環境變量列表 命令演示:$UID 命令說明:經過美圓符($)來使用環境變量
使用vim編寫test2以下並運行ui
#!/bin/bash # display user infomation from the system. echo "User info for userid: $USER" echo UID: $UID echo HOME: $HOME
說明:也能夠經過${variable}形式引用變量。變量名兩側額外的花括號一般用來幫助識別美圓符後的變量名。若是要顯示$符號,則須要使用進行轉義,如:\$
this
用戶變量
變量容許臨時存儲數據並在整個腳本中使用 由字母、數字或下劃線組成,長度不超過20個 特別注意變量名區分大小寫 使用等號進行賦值,且等號兩邊不能出現空格 例如:var1=十、var2="still more testing" shell腳本自動識別決定變量值的數據類型 經過美圓符號引用
使用vim編寫test3以下
#!/bin/bash days=10 guest="Katie" echo "$guest checked in $days days ago" days=5 guest="Jessica" echo "$guest checked in $days days ago"
引用一個變量值時須要使用美圓符,而引用變量來對其進行賦值時則不要使用美圓符
使用vim編寫test4以下
#!/bin/bash value1=10 value2=$value1 echo The resulting value2 is $value2 value3=value1 echo The resulting value3 is $value3
shell腳本中最有用的特性之一就是能夠從命令輸出中提取信息,並將其賦給變量。把輸出賦給變量以後,就能夠隨意在腳本中使用了。
有兩種方法能夠將命令輸出賦給變量
反引號字符(`):testing=`date` $()格式:testing=$(date)
使用vim編寫test5以下
#!/bin/bash # copy the /usr/bin directory listing to a log file today=$(date +%y%m%d) ls /usr/bin -al > log.$today
警告:命令替換會建立一個子shell來運行對應的命令。子shell(subshell)是由運行該腳本的shell所建立出來的一個獨立的子shell(child shell)。正由於如此,由該子shell所執行命令是沒法使用腳本中所建立的變量的。在命令行提示符下使用路徑./運行命令的話,也會建立出子shell;要是運行命令的時候不加入路徑,就不會建立子shell。
命令格式:command > outputfile 命令說明:使用大於號(>)重定向將命令的輸出發送到一個文件中 命令演示:date > test6 命令說明:重定向操做符建立了一個文件test6,並將date命令的輸出重定向到該文件中, 若是文件已經存在,則會覆蓋已有文件 命令演示:date >> test6 命令說明:將date命令的輸出追加到test6文件中
命令格式:command < inputfile 命令說明:使用小於號(<)輸入重定向將文件的內容重定向到命令
簡單的記憶方法:在命令行上,命令老是在左側,而重定向符號「指向」數據流動的方向。小於號說明數據正在從輸入文件流向命令
命令演示:wc < test6 命令說明:使用wc命令對數據中的文本進行計數。
默認狀況下,它會輸出3個值
文本的行數 文本的詞數 文本的字節數 命令格式:command << marker data marker 命令說明:內聯輸入重定向。使用遠小於符號(<<), 指定一個文本標記來劃分輸入數據的開始和結尾。 命令演示:wc << EOF test string 1 test string 2 test string 3 EOF 命令說明:使用wc命令對輸入的文本內容進行計數
有時須要將一個命令的輸出做爲另外一個命令的輸入。能夠將一個命令的輸出直接重定向到另外一個命令,這個過程叫做管道鏈接。
管道鏈接
命令格式:command1 | command2 使用符號:| 不要覺得由管道串起來的兩個命令爲依次執行。 Linux系統實際上會同時運行這兩個命令,在系統內部將它們鏈接起來。 在第一個命令產生輸出的同時,輸出會被當即送給第二個命令 數據傳輸不會用到中間文件或緩衝區 命令演示:apt list | sort | more 命令說明:顯示已安裝的軟件包並排序並安裝more命令來顯示
命令:more。經常使用操做
按Space鍵:顯示文本的下一屏內容 按Enter鍵:只顯示文本的下一行內容 按斜線符|:接着輸入一個模式,能夠在文本中尋找下一個相匹配的模式 按H鍵:顯示幫助屏,該屏上有相關的幫助信息 按B鍵:顯示上一屏內容 按Q鍵:退出rnore命令
命令:expr 命令說明:使用expr命令在命令行上處理數學表達式,特別笨拙 命令演示:expr 1 + 5 命令說明:計算1+5的值
expr命令操做符
ARG1 | ARG2:若是ARG1既不是null也不是零值,返回ARG1;不然返回ARG2 ARG1 & ARG2:若是沒有參數是null或零值,返回ARG1;不然返回0 ARG1 < ARG2:若是ARG1小於ARG2,返回1;不然返回0 ARG1 <= ARG2:若是ARG1小於或等於ARG2,返回1;不然返回0 ARG1 = ARG2:若是ARG1等於ARG2,返回1;不然返回0 ARG1 != ARG2:若是ARG1不等於ARG2,返回1;不然返回0 ARG1 >= ARG2:若是ARG1大於或等於ARG2,返回1;不然返回0 ARG1 > ARG2:若是ARG1大於ARG2,返回1;不然返回0 ARG1 + ARG2:返回ARG1和ARG2的算術運算和 ARG1 - ARG2:返回ARG1和ARG2的算術運算差 ARG1 * ARG2:返回ARG1和ARG2的算術乘積 ARG1 / ARG2:返回ARG1和ARG2的算術商(注意:只支持整數運算) ARG1 % ARG2:返回ARG1和ARG2的算術餘數 STRING:REGEXP:若是REGEXP匹配到了STRING中的某個模式,返回該模式匹配 match STRING REGEXP:若是REGEXP匹配到了STRING中的某個模式,返回該模式匹配 substr STRING POS LENGTH:返回起始位置爲POS(從1開始計數)、長度爲LENGTH子字符串 index STRING CHARS:返回在STRING中找到CHARS字符串的位置;不然,返回0 length STRING:返回字符串STRING的數值長度 + TOKEN:將TOKEN解釋成字符串,即便是個關鍵字 (EXPRESSION):返回EXPRESSION的值
修改test6腳本
#!/bin/bash var1=10 var2=20 var3=$(expr $var2 / $var1) echo The result is $var3
在使用的時候,注意對特殊符號進行轉義。在腳本中使用expr命令比較複雜。
命令格式:$[ operation ] 命令說明:使用美圓符和方括號將數學表達式圍起來。 這種方式比用expr命令方便,也適用於shell腳本。
編寫test7腳本
#!/bin/bash var1=100 var2=50 var3=45 var4=$[$var1 * ($var2-$var3)] echo The final result is $var4
編寫test8腳本
#!/bin/bash # 只支持整數運算 var1=100 var2=45 var3=$[$var1 / $var2] echo The final result is $var3
1.bc的基本用法
bc是內建的bash計算器,用於解決bash中數學運算的整數限制
bash計算器能夠識別
數字(整數和浮點數) 變量(簡單變量和數組) 註釋(以#或C語言中的/* */開始的行) 表達式 編程語句(例如if-then語句) 函數
命令格式:bc
命令說明:訪問bash計算器 命令格式:quit 命令說明:進入bash計算器後,輸入quit退出bash計算器
2.在腳本中使用bc
命令格式:variable=$(echo "options;expression" | bc) 命令說明:使用命令替換運行bc命令,並將輸出賦給一個變量。 options容許你設置變量,多個變量用分號隔開 expression參數定義了經過bc執行的數據表達式
編寫test9腳本
#!/bin/bash # 使用scale指定小數點後的位數 var1=$(echo "scale=4;3.44 / 5" | bc) echo The answer is $var1
編寫test10腳本
#!/bin/bash var1=100 var2=45 var3=$(echo "scale=4; $var1 / $var2" | bc) echo The answer for this is $var3
編寫test11腳本
#!/bin/bash var1=20 var2=3.14159 var3=$(echo "scale=4; $var1 * $var2" | bc) var4=$(echo "scale=4; $var3 * $var2" | bc) echo The final result is $var4
內聯重定向
命令格式:variable=$(bc << EOF options statements expressions EOF) 命令說明:使用內聯重定向數據進行命令替換符號將bc命令的輸出賦給變量
編寫test12腳本
#!/bin/bash var1=10.46 var2=43.67 var3=33.2 var4=71 var5=$(bc << EOF scale=4 a1 = ( $var1 * $var2) b1 = ( $var3 * $var4) a1 + b1 EOF ) echo The final answer for this mess is $var5
shell中運行的每一個命令都使用退出狀態碼(exit status)告訴shell它已經運行完畢。退出狀態碼是一個0~255的整數值,在命令結束運行時由命令傳給shell。能夠捕獲這個值並在腳本中使用。
命令格式:$? 命令說明:查看由shell所執行的最後一條命令的退出狀態碼 命令演示:echo $? 命令說明:顯示由shell所執行的最後一條命令的退出狀態碼
Linux錯誤退出狀態碼沒有什麼標準可循,但有一些有用的參考
0:命令成功結束 1:通常性未知錯誤 2:不適合的shell命令 126:命令不可執行(代表用戶沒有執行命令的正確權限) 127:沒找到命令 128:無效的退出參數 128+x 與Linux信號x相關的嚴重錯誤 130:經過Ctrl+C終止的命令 255:正常範圍以外的退出狀態碼
默認狀況下,shell腳本會以腳本中的最後一個命令的退出狀態碼退出。exit命令容許你在腳本結束時指定一個退出狀態碼
編寫test13腳本
#!/bin/bash var1=10 var2=30 var3=$[$var1 + $var2] echo The answer is $var3 exit 5
編寫test14腳本
#!/bin/bash var1=10 var2=30 var3=$[$var1 + $var2] echo The answer is $var3 exit $var3
編寫test14b腳本
#!/bin/bash var1=10 var2=30 var3=$[$var1 * $var2] echo The value is $var3 exit $var3
當指定的退出狀態碼超過255時,最終的結果是指定的數值除以256後獲得的餘數。在下一章,經過使用if-then語句來檢查某個命令返回的錯誤狀態,以便知道命令是否成功。
bash shell腳本容許你將多個命令串起來放進腳本中。講解了shell腳本的基本結構,變量的使用以及管道命令和算術運算,最後介紹了退出狀態碼。本章介紹了echo、$、$()、>、>>、<、<<、|、expr、$[]、bc、exit命令。
本章學習命令我的總結以下
echo:顯示消息 $:取變量值 $():命令替換 >:輸出重定向(覆蓋數據) >>:輸出重定向(追加數據) <:輸入重定向 <<:內聯輸出重定向 |:管道命令 expr:處理數據表達式進行算術運算 $[]:被方括號包圍的內容進行算術運算 bc:bash計算器進行浮點數算術運算 exit:指定退出狀態碼