Shell script(Shell腳本)的工做方式有兩種: shell
①交互式(Interactive):用戶每輸入一條命令,而後Shell當即執行一次; express
②批處理(Batch):由用戶實現編寫好一個完整的Shell腳本,Shell會一次性執行腳本中諸多的命令。 bash
查看系統可用的shell(/etc/shells文件) less
Linux系統默認的命令行終端解釋器爲Bash 測試
Shell腳本文件的格式: ui
腳本文件test1.sh的執行方式:spa
sh -x:實現shell腳本逐條語句的跟蹤 .net
sh -n:不執行腳本,僅進行語法的檢查 命令行
sh -v:執行腳本前,先將腳本的內容輸出到屏幕上 3d
(Linux系統中一切都是文件。後綴名.sh僅提示用戶該文件是一個腳本文件,並不表明該文件是能夠被用戶執行的。文件是否能夠被執行在於用戶是否擁有對該文件的x權限)(在子進程中執行)
用方式①/②/③執行test2.sh腳本,執行完成後回到命令行模式(父進程)輸出腳本中設置的變量,發現變量並不存在
(經過上述①/②/③方式(bash(sh)、絕對/相對路徑或者將路徑添加到$PATH中)來運行腳本時,該script會使用一個新的bash環境(子shell、子進程)來執行腳本內的命令。當子進程完成後(腳本執行結束),子進程內的各項變量或操做將會消失而不會傳回給父進程中。)
若經過source命令或小數點(.)來執行腳本,該script會在父進程中執行。所以,父進程擁有腳本內設置的變量、操做等。
bash shell中的數學運算:在方括號內計算數學公式 [ operation ],結果賦值爲result=$[ operation ]。
數學運算浮點解決方案:使用bc命令(bash的內建計算器)。
選項 |
做用 |
-q |
不顯示bc計算器的歡迎信息 |
輸入quit或組合鍵ctrl+d可退出bc計算器
浮點運算是由內建變量scale(數值範圍)控制的,須將這個值設置爲但願在計算結果中保留的小數位數,默認值爲0。
在腳本中使用bc命令,經過命令替換$(),將輸出結果賦值給一個變量:
基本格式爲 variable=$(echo "options; expression" | bc)
使用內聯輸入重定向<<,在命令行中重定向數據(特別適用於進行大量運算):
基本格式爲 varible=$(bc << EOF
options
statements
expressions
EOF
)
EOF字符串標識了重定向給bc命令的數據的終止。
bash計算器中建立的變量只在bash計算器中有效。
Shell中運行的每一個命令都使用退出狀態碼告訴shell它運行完畢。退出狀態碼:0-255的整數值,在命令結束運行時由命令傳給shell。變量$?用於保存上個已執行命令的退出狀態碼。退出狀態碼可配合exit命令使用。
狀態碼 |
描述 |
0 |
命令成功結束 |
1 |
通常性未知錯誤 |
2 |
不適合的shell命令 |
126 |
命令不可執行 |
127 |
沒找到命令 |
128 |
無效的退出參數 |
128+x |
與Linux信號x相關的嚴重錯誤 |
130 |
經過ctrl+c終止的命令 |
255 |
正常範圍以外的退出狀態碼 |
Shell script的的默認變量(接受用戶參數的變量)
test(測試):判斷條件表達式是夠成立。格式:test [參數]。單獨執行test命令後不會顯示任何信息。
可經過echo $?輸出上一條命令(test命令)執行後的返回結果,若爲0則表示執行(判斷)成功
或經過&&、||來顯示相關結果
操做符 |
做用 |
-e file1 |
測試file1文件是否存在(exist) |
-d file1 |
測試file1文件是否爲目錄類型,且是否存在(directory) |
-f file1 |
測試file1文件是否爲通常文件,且是否存在(file) |
-r file1 |
測試當前用戶對file1文件是否有讀取權限(read) |
-w file1 |
測試當前用戶對file1文件是否有寫入權限(write) |
-x file1 |
測試當前用戶對file1文件是否有執行權限(execute) |
file1-nt file2 |
測試file1是否比file2新(newer than)(檢查文件日期) |
file1-ot file2 |
測試file1是否比file2舊(older than) |
操做符 |
做用 |
n1 -eq n2 |
檢查n1是否等於n2(equal) |
n2 -ne n2 |
檢查n1是否不等於n2(not equal) |
n1-gt n2 |
檢查n1是否大於n2(greater than) |
n1 -lt n2 |
檢查n1是否小於n2(less than) |
n1 -le n2 |
檢查n1是否等於或小於n2(less equal) |
n1 -ge n2 |
檢查n1是否大於或等於n2(greater equal) |
Shell中不該使用"=="和"!="進行整數的比較(會將整數看成字符串來比較)
來自 <http://blog.csdn.net/zbw18297786698/article/details/77460786>
操做符 |
做用 |
str1 == str2 |
比較str1與str2字符串的內容是否相同 |
str1 != str2 |
比較str1與str2字符串的內容是否不一樣 |
-z str1 |
判斷str1字符串長度是否爲0(或未被定義) |
-n str1 |
判斷str1字符串長度是否爲非0 |
str1 > str2 |
判斷str1是否比str2大(逐位比較字符串的每一個字符,按字典順序比較大小) |
str1 < str2 |
判斷str1是否比str2小 |
(使用>、<(大於號、小於號)進行判斷時必須搭配轉義字符/使用,不然shell會誤認爲是重定向符號,把後字符串誤當成文件名)(比較字符串順序大小的測試中,大寫字母會被認爲是小於小寫字母的(與sort命令偏偏相反,在英語環境下sort命令會認爲大寫字母是大於小寫字母的,即排序結果中小寫字母優先於大寫字母出現))
操做符 |
做用 |
test1 -a test2 |
相似於&&,兩個測試條件同時成立時纔回傳true(and) |
test1 -o test2 |
相似於||,任一測試條件成立就回傳true(or) |
! test1 |
反向狀態(取反) |
[](中括號):判斷符號。bash shell提供的另外一種條件測試方法,做用同等與test命令,經常使用於if…then條件判斷式中。
[ "$yn" == "Y" -o "$yn" == "y" ] 也可寫成 [ "$yn" == "Y" ] || [ "$yn" == "y" ] (布爾邏輯能將可能的返回值簡化爲TRUE或FALSE類型)