登入到shell的過程
- linux系統在調用init初始化進程之前,主要是完成系統層級的一系列動作,此時,使用者根本無法使用系統,因為系統根本沒有讓使用者控制系統的途徑!
- init之所以存在,其意義應該是增加linux的靈活性 和 標準性:變異的linux完全可以調用其他的init程式;有了統一的init入口後,可以機動的定義之後的調用動作。
- 一般的linux總是調用init作為pid=1的進程,它是所有進程的起點!
- init調用login進程,進行登陸驗證
- login調用shell。shell有很多中,找個適合你自己的就行了
- shell才是使用者和linux的互動介面。這個介面就是為了讓使用者高效、方便、靈活、強大的控制和使用liunx而存在的!如果是特殊的應用。login完全可以不調用shell!
- shell會調用一系列初始設定檔案:
- /etc/profile --系統
- /etc/bashrc --系統
- ~/.bash_profile --user
- ~/.bashrc --user
- ~/.bash_login --user
- ~/.profle --user
- ~/.bash_logout --user logout
bash的基本用法
- bash顯示變數:echo $環境變數
- bash設定變數:set 環境變數=值
- bash倒出到系統變數:export 環境變數=值
- bash以當前shell環境執行一個指令碼,通常用於設定當前shell的環境變數:source【.】 指令碼
- bash解釋輸入的順序:命令空白..參數..斷行符號。命令的優先順序:
- 別名
- bash的編程關鍵字
- 函數
- 內建命令
- 外部命令
- bash的內建命令:help 獲得內建命令的協助
- bash的內建命令:type 獲得查詢命令的類型
- bash的內建命令:buildin、enable、command管理內、外命令是否生效
- bash命令執行狀態的返回變數:$? 通常:0.成功;127.命令未找到;>=128.程式錯誤終止
- bash無條件執行多個命令:各命令以分號“;”分隔。執行的狀態為最後一個命令的返回狀態。如果想讓多個命令的輸出重新導向到檔案,需要把這些命令放到(命令1;命令2; )> out.txt 內,最後的命令必須加空格
- bash依賴條件執行多個命令:各命令以“&&”分隔,前邊的執行成功才執行後邊的
- bash依賴條件執行多個命令:各命令以“||”分隔,前邊的執行失敗才執行後邊的
- bash後台執行命令:在命令後加上“&”。注意,如果該命令有螢幕輸出就不好了,需要重新導向到其他才不會影響前台的輸入等
- bash終止當前啟動並執行程式的執行:ctrol+c 或 ctrol + \
- bash將當前啟動並執行程式放到後台以作業的形式運行:ctrol+z,注意這樣實際上在後台上掛起的狀態。$!變數獲得最後放入背景作業的進程pid
- bash作業管理:
-
-
- ctrol+z --後台掛起; 命令& --後台運行
- jobs --列車所有後台作業。 -r 正在啟動並執行 ;-s 掛起的;%n 作業號;%name 作業名 ;%?name 含有name的作業; %+ 當前作業;%% 當前作業;%-上一個作業
- bg --執行後台作業
- fg --將後台作業放到前台執行
- stop --掛起後台作業
- stty tostop --如果後台作業有終端輸出,則掛起
- kill --終止後台作業
- wait --等待後台作業及其傳回值
- bash使用tab鍵自動完成命令 或 檔案名稱
- bash命令曆史功能:預設放在~/bash_history下。history內建命令顯示記錄。fc命令可以查看、執行曆史命令;“!!”可以執行最後曆史命令;“!n” 執行指定行號的曆史命令;“!name”執行以name開頭的最後執行的曆史命令
-
bash編程
一:變數
- declare 或 直接賦值 的局部變數:declare var1=20 或 var2='as df\df'
- export的全域變數:var1=sdaf export var1 或 export var2=vdsf3
- 位置變數:$1 ---- $n
- 特殊預定於變數:$0--當前進程的檔案名稱 $$--當前進程的spid $#--位置參數的個數 $!--後台最後執行的作業的作業號 $?--上一程式的執行狀態 $@--全部位置參數--原樣的參數列表 $*--全部位置參數--內部用單引號括起來的一個字串
- 其他預定於的環境變數:$UID $PWD $PATH...........
- 變數擴充:雖然 $vars可能會——變數和周圍文本通過空白分隔了——正確的工作,但${vars}總能正確的工作
- unset:刪除環境變數,不能刪除唯讀環境變數
- readonly var=值:定義唯讀環境變數。注意:唯讀意思是可以修改值,但不能unset環境變數
- 命令替換:反單引號方式`ls ` 或 $(ls ) 方式
二:注釋及魔數
# --行注釋
#!/bin/bash --魔數
三:進階變數擴充:參數變數的替換
- ${v1-v2} --如果v1沒義或為空白有定,v2替換v1,v1不會被更改 --定義預設值
- ${v1+v2} --如果v1沒義或為空白有定,不做任何處理,否則v2替換v1,v1不會被更改 --強制使用預設值
- ${v1=v2} --如果v1沒義或為空白有定,v2替換v1,v1被更改為v2。--注意因為更改v1,這種用法被能用於位置參數
- ${v1?v2} --如果v1沒義或為空白有定,非互動模式下:類似於${v1-v2},但bash有標準錯誤輸出;互動模式下:bash提示錯誤v1需要定義,提示內容為v2,並退出shell執行!
- ${var##*str} --開頭長變數截去
- ${var#*str} --開頭短變數截去
- ${var%%str*} --末尾長變數截去
- ${var%str*} --末尾短變數截去
- ${var/pattern} --開頭模式比對刪除。可以通過在pattern上加上“#、%”來明確指示是開頭還是結尾刪除
- ${var//pattern} --模式比對刪除
- ${var/pattern/replace} --模式比對替換
- ${var//pattern/replace} --模式比對替換
- ${var:startpos:length} --截取指定位置和長度的字串,開始位置、長度均可省略,預設為0或1、到末尾
四:條件測試運算式
數值測試,複合模式下,可以使用c的文法和運算子
- -eq 等於 --注意和字串比較的 “=”類似
- -ne 不等於 --注意和字串比較的 “!=”類似
- -gt 大於
- -lt 小於
- -ge 大於等於
- -le 小於等於
- ...
- ...
字串比較:注意雙引號引用的使用
- = 等於
- ==萬用字元比較
- != 不等於
- >
- <
- -z字串 字串長度等於0
- -n字串 字串長度大於0
檔案測試
- -e檔案名稱 檔案存在
- -r檔案名稱 檔案存在且可讀
- -w檔案名稱 檔案存在且可寫
- -x檔案名稱 檔案存在且可執行
- -s檔案名稱 檔案存在且至少有一個字元
- -S檔案名稱 檔案存在且是通訊端
- -d目錄名 檔案存在且目錄存在
- -f檔案名稱 檔案存在且普通檔案
- -c檔案名稱 檔案存在且字元檔案
- -b檔案名稱 檔案存在且塊檔案
- -p檔案名稱 檔案存在且是管道檔案
- -L|-h檔案名稱 檔案存在且是符號連結檔案
- -N檔案名稱 檔案自最後讀取後發生修改
- file1 -nt file2 file1 比 file2 檔案新
- file1 -ot file2 file1 比 file2 檔案舊
- file1 -ef file2 file1 是否是 file2 的硬串連
符合運算子
- test express 內建命令測試 等同於 [express] --不能屏蔽特殊字元如>、 <、 \、 (、) 等等
- [express] 內建命令測試 等同於 test express --不能屏蔽特殊字元如>、 <、 \、 (、) 等等
- [[express]] 字串複合運算子運算式,指出萬用字元比較。
- ((express)) 算數複合運算子運算式 可以使用類似於c的文法
- let express 算數運算賦值測試內建命令
五:數值計算運算式
$((express)) 或 $[express]
六:基本流程式控制制語句。這些語句的關鍵字必須放在不同的行
if 條件測試
then
命令
elif [condition]
then
命令
else
命令
fi
for 變數 [in 列表] --注意這裡的“變數”是迴圈控制變數
do
若干命令
done
例子1:
for myfile in /etc/r* /var/lo* ${ORACLE_HOME}/*
do
if [-d "$myfile"]
then
echo "$myfile is (dir)"
else
echo "$myfile is (file)"
fi
done
例子2:
#! /bin/bash
for param in "$@"
do
echo "$param"
done
while|until --區別在於while當“若干命令1”最後執行的狀態為真時執行迴圈,until反之
若干命令1
do
若干命令2
done
case string in
exp1)
若干命令1
;;
exp2)
若干命令2
;;
.........
*)
其他命令
esac
breake 和 continue
七:函數。函數實際上是一組程式,是shell指令碼程式的一部分
注意:bash的函數中定義的變數即是shell全域變數,所以必須注意變數的使用。可以通過在函數內定義的變數聲明為local來避免對函數外部全域變數的影響!
functionname
{
local var=值
若干命令
}
函數的調用:functionname param1 param2 ...
shell將會自動將這些參數傳給位置變數$1 $2 .... $# $*
八:命令分組
(命令) --shell開啟新的子shell進程調用命令
{命令} --shell以管道的方式從自身的shell進程中運行命令
九:bash的執行和調試
執行:bash 指令檔 或 將指令檔設定為可執行
調試:bash 選項 指令檔。常用的調試選項
- -n --讀入命令但不執行
- -u --如果變數未設定,則認為程式錯誤
- -v --讀入shell的輸入行時顯示出來
- -x --執行shell命令時,顯示命令及其參數
- 在shell程式內使用echo等內部命令輸出變數及中間結果
十:bash中特殊的函數、語句、其他
dirname 和 basename 是字串函數
標識不同進位的數值:base#數字記號 --如 八進位057、 16進位0x23a、2進位2#0101、30進位30#12b