Shell script(Shell腳本)的工作方式有兩種:
①交互式(Interactive):用戶每輸入一條命令,,然后Shell立即執(zhí)行一次;
②批處理(Batch):由用戶實現(xiàn)編寫好一個完整的Shell腳本,Shell會一次性執(zhí)行腳本中諸多的命令,。
查看系統(tǒng)可用的shell(/etc/shells文件)
Linux系統(tǒng)默認(rèn)的命令行終端解釋器為Bash
Shell腳本文件的格式:
第一行(一般必須寫明):指定腳本使用的shell(若不寫明也不影響腳本的執(zhí)行,,系統(tǒng)會自動以sh解析腳本)。'#!/bin/bash'聲明文件內(nèi)的語法使用bash的語法,,當(dāng)這個程序被執(zhí)行時,,加載bash的相關(guān)環(huán)境配置文件(一般是non-login shell中的~/.bashrc文件)。
第二部分的注釋(可寫):程序內(nèi)容的說明,。shell腳本中,,井號#用作批注(除第一行的'#!'外),shell不會解釋以#開頭的行(除第一行bash聲明外),。
主要環(huán)境變量的聲明(可寫)
腳本的程序部分,。
程序執(zhí)行結(jié)束,回傳一個數(shù)值給系統(tǒng)告知執(zhí)行的結(jié)果(可寫,。默認(rèn)命令執(zhí)行成功返回數(shù)值0),。
腳本文件test1.sh的執(zhí)行方式:
以sh(bash)進程來執(zhí)行腳本文件(用戶不必?fù)碛袑δ_本文件的x權(quán)限)(在子進程中執(zhí)行)
通過絕對或相對路徑來執(zhí)行腳本文件(用戶須擁有對腳本文件的x權(quán)限)
(Linux系統(tǒng)中一切都是文件。后綴名.sh僅提示用戶該文件是一個腳本文件,,并不代表該文件是可以被用戶執(zhí)行的,。文件是否可以被執(zhí)行在于用戶是否擁有對該文件的x權(quán)限)(在子進程中執(zhí)行)
將腳本文件所處的目錄添加到PATH環(huán)境變量中,通過輸入腳本文件名來直接運行(用戶須擁有對腳本文件的x權(quán)限)(在子進程中執(zhí)行)
sh -x:實現(xiàn)shell腳本逐條語句的跟蹤
sh -n:不執(zhí)行腳本,,僅進行語法的檢查
sh -v:執(zhí)行腳本前,,先將腳本的內(nèi)容輸出到屏幕上
通過source命令或小數(shù)點(.)來執(zhí)行腳本文件(在父進程中執(zhí)行)
用方式①/②/③執(zhí)行test2.sh腳本,執(zhí)行完成后回到命令行模式(父進程)輸出腳本中設(shè)置的變量,,發(fā)現(xiàn)變量并不存在
(通過上述①/②/③方式(bash(sh),、絕對/相對路徑或者將路徑添加到$PATH中)來運行腳本時,該script會使用一個新的bash環(huán)境(子shell,、子進程)來執(zhí)行腳本內(nèi)的命令,。當(dāng)子進程完成后(腳本執(zhí)行結(jié)束),子進程內(nèi)的各項變量或操作將會消失而不會傳回給父進程中,。)
若通過source命令或小數(shù)點(.)來執(zhí)行腳本,,該script會在父進程中執(zhí)行。因此,,父進程擁有腳本內(nèi)設(shè)置的變量,、操作等。
bash shell中的數(shù)學(xué)運算:在方括號內(nèi)計算數(shù)學(xué)公式[operation],,結(jié)果賦值為result=$[ operation ],。
數(shù)學(xué)運算浮點解決方案:使用bc命令(bash的內(nèi)建計算器)。
輸入quit或組合鍵ctrl+d可退出bc計算器
浮點運算是由內(nèi)建變量scale(數(shù)值范圍)控制的,,須將這個值設(shè)置為希望在計算結(jié)果中保留的小數(shù)位數(shù),默認(rèn)值為0,。
在腳本中使用bc命令,,通過命令替換$(),,將輸出結(jié)果賦值給一個變量:
基本格式為 variable=$(echo 'options; expression' | bc)
使用內(nèi)聯(lián)輸入重定向<>
基本格式為 varible=$(bc <>
options
statements
expressions
EOF
)
EOF字符串標(biāo)識了重定向給bc命令的數(shù)據(jù)的終止。
bash計算器中創(chuàng)建的變量只在bash計算器中有效,。
Shell中運行的每個命令都使用退出狀態(tài)碼告訴shell它運行完畢,。退出狀態(tài)碼:0-255的整數(shù)值,在命令結(jié)束運行時由命令傳給shell,。變量$?用于保存上個已執(zhí)行命令的退出狀態(tài)碼,。退出狀態(tài)碼可配合exit命令使用。
狀態(tài)碼 | 描述 |
0 | 命令成功結(jié)束 |
1 | 一般性未知錯誤 |
2 | 不適合的shell命令 |
126 | 命令不可執(zhí)行 |
127 | 沒找到命令 |
128 | 無效的退出參數(shù) |
128+x | 與Linux信號x相關(guān)的嚴(yán)重錯誤 |
130 | 通過ctrl+c終止的命令 |
255 | 正常范圍之外的退出狀態(tài)碼 |
Shell script的的默認(rèn)變量(接受用戶參數(shù)的變量)
$0:當(dāng)前Shell腳本程序的名稱,;
$#:參數(shù)的個數(shù),;
$*:所有位置的參數(shù)值;
$?:上一條命令的執(zhí)行返回值,;
$1,、$2、$3……:第N個位置的參數(shù)值,。
test(測試):判斷條件表達式是夠成立,。格式:test [參數(shù)]。單獨執(zhí)行test命令后不會顯示任何信息,。
可通過echo $?輸出上一條命令(test命令)執(zhí)行后的返回結(jié)果,,若為0則表示執(zhí)行(判斷)成功
或通過&&、||來顯示相關(guān)結(jié)果
操作符 | 作用 |
-e file1 | 測試file1文件是否存在(exist) |
-d file1 | 測試file1文件是否為目錄類型,,且是否存在(directory) |
-f file1 | 測試file1文件是否為一般文件,,且是否存在(file) |
-r file1 | 測試當(dāng)前用戶對file1文件是否有讀取權(quán)限(read) |
-w file1 | 測試當(dāng)前用戶對file1文件是否有寫入權(quán)限(write) |
-x file1 | 測試當(dāng)前用戶對file1文件是否有執(zhí)行權(quán)限(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中不應(yīng)使用'=='和'!='進行整數(shù)的比較(會將整數(shù)當(dāng)作字符串來比較)
來自 操作符 | 作用 |
str1 == str2 | 比較str1與str2字符串的內(nèi)容是否相同 |
str1 != str2 | 比較str1與str2字符串的內(nèi)容是否不同 |
-z str1 | 判斷str1字符串長度是否為0(或未被定義) |
-n str1 | 判斷str1字符串長度是否為非0 |
str1 > str2 | 判斷str1是否比str2大(逐位比較字符串的每個字符,按字典順序比較大?。?/td> |
str1 <> | 判斷str1是否比str2小 |
(使用>,、<(大于號、小于號)進行判斷時必須搭配轉(zhuǎn)義字符>(大于號,、小于號)進行判斷時必須搭配轉(zhuǎn)義字符>
操作符 | 作用 |
test1 -a test2 | 類似于&&,,兩個測試條件同時成立時才回傳true(and) |
test1 -o test2 | 類似于||,任一測試條件成立就回傳true(or) |
! test1 | 反向狀態(tài)(取反) |
[](中括號):判斷符號,。bash shell提供的另一種條件測試方法,,作用同等與test命令,常用于if…then條件判斷式中,。
[ '$yn' == 'Y' -o '$yn' == 'y' ]也可寫成[ '$yn' == 'Y' ] || [ '$yn' == 'y' ](布爾邏輯能將可能的返回值簡化為TRUE或FALSE類型)