守護進程:運行在後臺的進程,稱之爲守護進程也叫服務進程(提供某種特定的服務),多數會被設置爲開機時自動啓動;
交互式進程:與用戶有交互方能實現功能的,shell應用程序
GUI:圖形化的交互進程
CLI:命令形式交互進程
COMMANDshell
shell程序會進行詞法分析區分哪些字符串是命令,哪些字符串是選項,哪些字符 串是參數
shell程序內建一部分命令(shell內建命令)
shell程序也能調用外部命令,外部命令的二進制源碼存放在環境變量PATH指 定的路徑中(外部命令)編程
fork() shell爲每個要執行的命令建立爲一個子進程;centos
腳本或程序源文件:把要運行的一系列命令,寫在文件中;bash
兩種方式:
編譯執行:預處理-->編譯-->彙編-->連接;必須事先完成整個文本文件內容的語言轉換爲 二進制,處理後獲得二進制程序文件提交給cpu執行
C, C++
解釋執行:由解釋器全程參與運行過程,每次讀取一行並解釋一行得到二進制,將結果提 交給cpu運行;
Python:編程庫
程序控制結構,調用編程庫完成程序編寫;
能夠調用庫文件:功能模塊,在編程中可調用;經過其API;
Bash:編程
程序控制結構,調用機器上命令程序文件進行程序編寫;
調用外部命令:各應用程序提供;ide
bash過程式編程:
順序執行:逐個執行文本文件中的命令
選擇執行:只執行其中符合選擇條件的一個分支
循環執行:一段代碼要執行0,1或多遍模塊化
變量:一個命名了的內存空間,變量名能夠理解爲某內存空間的地址門牌號。經過 $變量名 能夠獲 得該變量表明的內存空間中所存放的值 函數
bash環境中有以下幾種變量:
本地變量:只在當前shell進程中生效的變量;
環境變量:在當前shell進程及其子進程生效的變量;
局部變量:某個函數執行過程當中,該函數外無效;
位置參數變量:在腳本中引用傳遞給腳本的參數;在函數中引用傳遞給函數的參數;
特殊變量:$?:上一條命令的執行狀態結果
$*:統計傳遞給腳本文件的參數列表
$@:統計傳遞給腳本文件的參數列表
$#:統計傳遞給腳本文件的參數數量
$$:表示當前進程的編號測試
變量類型:該變量所表明的內存空間所存放的值類型
數值,字符;
數值:
整數
浮點數
字符:
ASCIIspa
120:
字符:1, 2, 0-->一個1表明一個字符用一個字節表示0000 0001
數值:120 --> 一個字節便能表示數值120,1111 10003d
變量類型的做用:
存儲空間:聲明變量類型有利於節省存儲空間的節省
運算:聲明變量類型爲數值型才能進行變量運算
存儲格式:聲明變量肯定變量是以字符仍是數值存儲
語言對變量類型的支持力度:
強類型:嚴格區分變量類型,必須事先聲明
弱類型:變量類型不嚴格區分;
bash默認存儲機制:存儲爲字符
bash的變量使用特色:弱類型、無須事先聲明;
凡是自定義的變量儘可能小寫 避開系統自身的變量名
本地變量:
name=value
name: 變量名
=:賦值符號
value:值
變量名:只能包含數字、字母和下劃線;且不能以數字開頭;
引用變量:$name
${name}(用在變量內容後面加字符修飾)例如 :name=dog 想表示dogs時 引用${name}s
引用:
弱引用: "", 其內部的變量引用會被替換爲變量值;
強引用:'',其內部的變量引用會保持原有字符;
命令引用:`COMMAND`, $(COMMAND),引用命令的執行結果;
示例
[root@pks ~]# s1=dog ##設定本地變量s1 [root@pks ~]# echo "$s1" ##使用弱引用「」變量,替換成變量值 dog [root@pks ~]# echo '$s1' ##使用強引用‘’變量,保留變量名稱的字符 $s1 [root@pks ~]# echo $(ls /mnt) ##使用命令替換 取得命令的執行結果 a centos gcc-4.8.3-9.el7.x86_64.rpm gcc5-5.1.1+r225724-1.1.x86_64.rpm grub.conf host.conf hosts hosts-test k p prelink.cache prelink.conf y [root@pks ~]# echo "${s1}s" ##爲變量值後跟字符使用${變量} dogs
聲明爲整型:
declare -i name[=value]
let name=value
聲明整數類型和在沒有聲明整數類型的狀況下其結果同樣,這是由於bash爲弱類型、 無須事先聲明,在使用變量進行運算的時候會進行隱式轉行。
查看全部當前的本地變量:set
生命週期:
建立:從變量賦值開始
銷燬:
自動銷燬:shell進程終止;
手動銷燬:unset name
[root@pks ~]# unset s1 [root@pks ~]# echo "$s1" [root@pks ~]#
環境變量:
用」導出「的方式使本地變量升級爲環境變量
export name[=value]
declare -x name[=value]
[root@pks ~]# s1=dog [root@pks ~]# echo "$s1" dog [root@pks ~]# bash ##開一個子bash進程 [root@pks ~]# echo "$s1" ##在子bash進程查無s1變量 [root@pks ~]# exit ##退出bash子進程 [root@pks ~]# export s1 ##在當前進程中聲明s1爲環境變量 [root@pks ~]# bash [root@pks ~]# echo "$s1" ##在子bash進程查有s1變量,其值也爲dog dog
查看全部環境變量:env, printenv, export
生命週期:
建立:從變量賦值開始
銷燬:unset name
腳本:文本文件
運行腳本:事實上是建立一個bash子進程,此進程負責從腳本文件中讀取一個執行邏輯,然後由 bash進程負責解析並運行此邏輯;
啓動腳本:
(1) # bash /PATH/TO/SCRIPT_FILE
(2) 給予腳本文件執行權限,使用以下命令
# ./PATH/TO/SCRIPT_FILE
腳本文件的開頭shebang:
#!/bin/bash,指明解釋器的路徑
第一行:頂格給出shebang
註釋行:#爲註釋所用不會被bash進程解析該段字符
bash的經常使用選項:
-n: 檢查腳本中的語法錯誤;
-x:調試執行腳本;(會將執行過程一步步顯示出來,便於邏輯調試)
命令狀態結果:
bash進程使用特殊變量#?用於追蹤執行的命令成功與否的狀態:
0: 成功
1-255:失敗
布爾型:
「真」:成功
「假」:失敗
能夠自定義腳本的執行狀態狀態結果:
exit [n]
注意:腳本中任何位置執行了exit命令即會終止當前shell進程,若是有自定義的執行狀態 值並將該值提交給特殊變量;
特殊設備:
/dev/null: 空,bit buckets,吞下全部數據,並直接丟棄;
取命令執行結果狀態而不須要命令的執行結果時,能夠輸出重定向&> /dev/null
/dev/zero:吐出一堆0;
腳本參數(位置參數變量):
# ./script.sh /etc/fstab /etc/grub2.cfg
$0(腳本自己)
$1(腳本的第一個參數 /etc/fstab )
$2(腳本的第一個參數 /etc/grub2.cfg)
位置參數變量:$1, $2, ...
${10},雙位數以上的變量引用時需用{}包裹數值
[root@pks var]# cat cat.sh #!/bin/bash # cat $1 echo "----------" cat $2
[root@pks var]# ./cat.sh /etc/fstab /etc/host.conf # # /etc/fstab # Created by anaconda on Wed Aug 19 21:28:16 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=f745eac2-6b4c-48e8-bae5-aa43cd3d313a / ext4 defaults 1 1 UUID=baaa7f26-f28c-4db8-91fd-10c0d14ea07d /boot ext4 defaults 1 2 UUID=6becb873-32d7-4c9a-bfb8-838f021ca0e3 swap swap defaults 0 0 /dev/sdb2 /mydata ext4 defaults 1 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 ---------- multi on
特殊變量:
$?: 命令的執行狀態結果;
$#: 傳遞給腳本或函數的參數的個數;
$*和$@: 引用傳遞給腳本或函數的參數列表;
shift [n]:表明一次輪替掉n個參數,(默認輪替掉一個參數) 例如$1是a,$2是b,$3爲c
shift後$1爲b ,shift 2後$1爲c
[root@pks var]# cat cat1.sh #!/bin/bash # echo "$#" echo "----------" echo "$*" echo "----------" echo "$@" echo "----------" echo "$1" shift echo "----------" echo "$1" [root@pks var]# chmod +x cat1.sh [root@pks var]# bash cat1.sh /etc/fstab /etc/host.conf 2 ##echo "$#" ---------- /etc/fstab /etc/host.conf ##echo "$*" ---------- /etc/fstab /etc/host.conf ##echo "$@" ---------- /etc/fstab ##echo "$1" ---------- /etc/host.conf ## shift 以後第一個變量被替換
與用戶交互:接受用戶輸入參數
read命令:
read [options] VAR...
-p "PROMPT" (用於作說明提示)
-t timeout (說明若是多長時間沒輸入將會結束腳本)
當輸入超過參數數量時,按空格依次賦值參數,以後輸入所剩的部分全賦值給最後一個參數
當參數數量多餘輸入時,按空格依次賦值參數,沒有被賦值的變量值爲空
[root@pks var]# read f1 f2 hou are you [root@pks var]# echo "$f1" hou [root@pks var]# echo "$f2" are you [root@pks var]# read f1 f2 f3 hello you [root@pks var]# echo "$f1" hello [root@pks var]# echo "$f2" you [root@pks var]# echo "$f3" [root@pks var]#
命令引用:
`COMMAND`, $(COMMAND)
引用命令的執行結果;
(1) ls `which cat`
(2) lines=$(wc -l /etc/fstab | cut -d' ' -f1)
算術運算:
+, -, *, /, %, **
(1) $[$A+$B]
(2) $(($A+$B))
(3) let VARIABLE=$A+$B
(4) VARIABLE=$(expr $A + $B)
[root@pks var]# A=5 [root@pks var]# B=7 [root@pks var]# C=$[$A+$B] [root@pks var]# echo "$C" 12 [root@pks var]# D=$(($A+$B)) [root@pks var]# echo "$D" 12 [root@pks var]# let E=$A+$B [root@pks var]# echo "$E" 12 [root@pks var]# F=$(expr $A+$B) [root@pks var]# echo "$F" 5+7 [root@pks var]# F=$(expr $A + $B) ##加號之間必須有空格 [root@pks var]# echo "$F" 12
加強型賦值:
+=
let sum+=$i至關於sum=$[$sum+$i]
-=, *=, /=, %=等用法和+=是同樣的
let count=$[$count+1] --> let count+=1 --> let count++
let count=$[$count-1] --> let count-=1 --> let count--
示例:顯示/etc目錄下全部普通文件列表,然後統計一共有多少個文件;
#!/bin/bash
#
declare -i count=0 ##定義計數器 整型變量count
for file in /etc/*; do ##使用通配方法生產/etc文件目錄下的文件列表
if [ -f $file ]; then
let count++ ##當是普通文件時計數器變量count本身+1
echo "$count $file"
fi
done
echo "Total: $count files."
測試表達式:
整數測試:-gt, -lt, -ge, -le, -eq, -ne
字符串測試:==, >, <, !=, -z, -n, =~
注意:
(1) 字符串等值比較測試:[ "$hostname" == 'localhost' ]
(2) 模式匹配測試:[[ "STRING" =~ PATTERN ]]
[root@pks var]# str1=hello [root@pks var]# [ "$str1" == 'hello' ] [root@pks var]# echo "$?" 0 [root@pks var]# [[ "$str1" =~ hel* ]] [root@pks var]# echo "$?" 0 [root@pks var]# [ "$str1" != 'hel' ] [root@pks var]# echo "$?" 0 [root@pks var]# [ "$str1" = 'hel' ] [root@pks var]# echo "$?" 1 [root@pks var]#
組合測試條件:
條件間邏輯運算:
與:多個條件要同時知足;
或:多個條件知足其一便可;
非:對指定的條件取反;
表達式組合:
與:` CONDITION1 -a CONDITION2 `
或:` CONDITION1 -o CONDITION2 `
非:[ ! CONDITION ]
命令組合:
與:COMMAND1 && COMMAND2 <-- [ EXPR1 ] && [ EXPR2 ]
或:COMMAND1 || COMMAND2
非:! COMMAND
短路操做符:&&
false && true = false
false && false = false
true && false = false
true && true = true
COMMAND1 && COMMAND2 只有當COMMAND1成立時,纔會執行COMMAND2;效果等同下 面的if
if COMMAND1; then
COMMAND2
fi
短路操做符:||
true || true = true
true || false = true
false || true = true
false || false = false
COMMAND1 && COMMAND2 只有當COMMAND1不成立時,纔會執行COMMAND2;效果等同 下面的if
if ! COMMAND1; then
COMMAND2
fi
COMMAND1 && COMMAND2 || COMMAND3 只有當COMMAND1成立時,纔會執行COMMAND2; 若是COMMADN1不成立則是COMMAND1 && COMMAND2整個不成立,便會執行command3
效果等同下面的if
if COMMAND1; then
COMMAND2
else
COMMAND3
fi
注意:&&的級別高於||
函數:
function: 功能
把一段具備獨立功能代碼封裝在一塊兒,並給予命名;後續用到時,可直接經過給定函數名來調用總體代碼;
函數做用:
代碼重用;
模塊化編程;將一段代碼放在其餘文件中,運行腳本文件時能夠讀入那其餘文件中的 代碼
函數的使用方法:
先定義:編寫函數代碼
後調用:給出函數名,還可按需傳遞參數
定義方法:
(1) function f_name {
函數體
}
(2) f_name() {
函數體
}
調用函數:
f_name [argu1, argu2, ...]
自定義函數狀態返回值:
return [#]
0: 成功
1-255:失敗
注意:函數代碼執行時,一旦遇到return,函數代碼終止運行,函數返回;
模塊化編程
功能:把腳本文件中的代碼分隔爲多段,放在不一樣的文件中
假設/root/bin/srv目錄有兩個文件:
(1) 函數文件
(2) 腳本文件
爲腳本使用配置文件
一個文件中只定義變量
腳本文件source此變量定義的文件
變量的做用域:
局部變量:
local VARIABLE=value
存活時間: 函數執行開始,至函數返回結束;