Shell script(Shell腳本)的工作方式有兩種: ①互動式(Interactive):用戶每輸入一條命令,然後Shell立即執行一次; ②批處理(Batch):由用戶實現編寫好一個完整的Shell腳本,Shell會一次性執行腳本中諸多的命令。 查看系統可用的shell(/etc/shel ...
Shell script(Shell腳本)的工作方式有兩種:
①互動式(Interactive):用戶每輸入一條命令,然後Shell立即執行一次;
②批處理(Batch):由用戶實現編寫好一個完整的Shell腳本,Shell會一次性執行腳本中諸多的命令。
查看系統可用的shell(/etc/shells文件)
Linux系統預設的命令行終端解釋器為Bash
Shell腳本文件的格式:
- 第一行(一般必須寫明):指定腳本使用的shell(若不寫明也不影響腳本的執行,系統會自動以sh解析腳本)。"#!/bin/bash"聲明文件內的語法使用bash的語法,當這個程式被執行時,載入bash的相關環境配置文件(一般是non-login shell中的~/.bashrc文件)。
- 第二部分的註釋(可寫):程式內容的說明。shell腳本中,井號#用作批註(除第一行的"#!"外),shell不會解釋以#開頭的行(除第一行bash聲明外)。
- 主要環境變數的聲明(可寫)
- 腳本的程式部分。
- 程式執行結束,回傳一個數值給系統告知執行的結果(可寫。預設命令執行成功返回數值0)。
腳本文件test1.sh的執行方式:
-
以sh(bash)進程來執行腳本文件(用戶不必擁有對腳本文件的x許可權)(在子進程中執行)
sh -x:實現shell腳本逐條語句的跟蹤
sh -n:不執行腳本,僅進行語法的檢查
sh -v:執行腳本前,先將腳本的內容輸出到屏幕上
-
通過絕對或相對路徑來執行腳本文件(用戶須擁有對腳本文件的x許可權)
(Linux系統中一切都是文件。尾碼名.sh僅提示用戶該文件是一個腳本文件,並不代表該文件是可以被用戶執行的。文件是否可以被執行在於用戶是否擁有對該文件的x許可權)(在子進程中執行)
-
將腳本文件所處的目錄添加到PATH環境變數中,通過輸入腳本文件名來直接運行(用戶須擁有對腳本文件的x許可權)(在子進程中執行)
-
通過source命令或小數點(.)來執行腳本文件(在父進程中執行)
用方式①/②/③執行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的的預設變數(接受用戶參數的變數)
- $0:當前Shell腳本程式的名稱;
- $#:參數的個數;
- $*:所有位置的參數值;
- $?:上一條命令的執行返回值;
- $1、$2、$3……:第N個位置的參數值。
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類型)