Linux基礎教程之bash腳本進階

case? 變量引用? in
?
PAT1)分支1
;;
PAT2)? 分支2
;;
*)
分支n
;;
esac
?
case支持glob風格的通配符:
? *:任意長度任意字符:
?:任意單個字符:
[ ]:指定范圍內的任意單個字符:
a|b:a或b
?
function:函數
???????? 過程式編程:代碼重用
??????????????? 模塊化編程
???? 結構化編程
?
語法一:
function f_name {?
??????????????? …函數體…
}
?
語法二:
?????? f_name() {
?? …函數體…
}
調用:函數只有被調用才會執行:
????????????? 調用:給定函數名
???? 函數名出現的地方,會被自動替換為函數代碼:
?????????????
????????????? 函數的生命周期:被調用時創建,返回時終止:
??????????????????? return命令返回自定義狀態結果:
??? 0:成功
??? 1-255:失敗
?
函數返回值:
函數的執行結果返回值:
(1)使用echo或print命令進行輸出:
(2)函數體中調用命令的執行結果:
函數的推出狀態碼:
(1)默認取決于函數體中執行的最后一條命令的推出狀態碼:
(2)自定義退出狀態碼:
???????? return
?
函數可以接收參數:
傳遞參數給函數:調用函數時,在函數名后面以空白分割給定參數列表即可:例如“testfunc arg1 arg2 …”

在函數體當中,可使用$1,$2,….調用這些參數:還可以使用[email protected],$*,$#等特殊變量:

變量作用域:指的它的生效范圍
???????????????????? 本地變量:當前shell進程:為了執行腳本會啟動專用的shell進程:因此,本地變量的作用范圍是shell腳本程序文件:
局部變量:函數的生命周期:函數結束時變量被自動銷毀
如果函數中有局部變量,其名稱同本地變量:
?
在函數中定義局部變量的方法:
local NAME=VALUE
?
函數遞歸:
?????? 函數直接或間接調用自身:
N!=N(n-1)(n-2)…1
1 1 2 3 5 8
vim fact.sh
#!/bin/bash
#
fact() {
???? if [ $1 -eq 0 -o $1 -eq 1 ]; then
??????? echo 1
???? else
??????? echo $[$1*$(fact $[$1-1])]
???? fi
}
fact 5
練習:求n階斐波那契數列:
#!/bin/bash
#
fab() {
if [ $1 -eq 1 ]; then
echo 1
elif [ $1 -eq 2 ]; then
echo 1
else
echo $[$(fab $[$1-1])+$(fab $[$1-2])]
}
fab 7
?
Systemd:
POST — > Boot Sequence –> Bootloader –> kernel + initramfs(initrd) –> rootfs –> /sbin/init
init:
?????? CentOS 5: SysV init
CentOS 6: Upstart
CentOS 7: Systemd
Systemd新特性:
系統引導時實現服務并行啟動:
按需激活進程:
系統狀態快照:
基于依賴關系定義服務控制邏輯:
?
核心概念:unit
??????? 配置文件進行標識和配置:文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息:保存至:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
?
Unit的類型:
Service unit: 文件擴展名為.service,用于定義系統服務:
Target unit:文件擴展名為。target,用于模擬實現“運行級別”:
Device unit: .mount , 定義文件系統掛載點:
Socket unit:.socket ,用于標識進程間通信用的socket文件:
Swap unit :.swap , 用于標識swap設備:
Automount unit: .autoount,文件系統的自動掛載點:
Path unit :.path , 用于定義文件系統中的一個文件或目錄:
?
關鍵特性:
基于socket的激活機制:socket與服務程序分離:
基于bus的激活機制:
基于device的激活機制:
基于path的激活機制:
系統快照:保存各unit的當前狀態信息于持久存儲設備中:
向后兼容sysv init腳本:
?
不兼容
systemctl命令固定不變
非由systemd啟動的服務,systemctl無法與之通信
?
管理系統服務:
CentOS 7: service unit
注意:能兼容早期的服務版本
?
命令:systemctl COMMAND name.service
啟動:service name start ==> systemctl start name.service
停止:service name stop ==> systemctl stop name.service
重啟:service name restart ==> systemctl restart name.service
狀態:service name status ==> systemctl status name.service
條件式重啟:service name condrestart ==> systemctl? try-restart name.service
重載或重啟服務:systemctl reload-or-restart name.service
重載或條件式重啟服務:systemctl reload-or-try-restart name.service
禁止設定為開機自啟:systemctl? mask name.service
取消禁止設定為開機自啟:systemctl unmask name.service
?
查看某服務當前激活與否的狀態:chkconfig –list name ==> systemctl is-active name.service
查看所有已經激活的服務:
systemctl list-units –type service
查看所有服務:
systemctl list-units –type service –all
學習linux主要后期都是實現服務管理類,所以這些服務管理類的命令要記清。
?
chkconfig命令的對應關系:
設定某服務開機自啟:chkconfig name on ==> systemctl enable name.service
禁止:chkconfig name off ==> systemctl disable name.service
查看所有服務的開機自啟狀態
chkonfig –list ==> systemctl list-unit-files –type service
?
target units:
unit配置文件:.target
運行級別:
???? 0 ==> runlevel0.target,poweroff.target?? 這兩種設定為關機
???? 1 ==> runlevel1.target,rescue.target?????? 單用戶模式
???? 2? ==> runlevel2.target,multi-user.target??
???? 3? ==> runlevel3.target,multi-user.target
???? 4? ==> runlevel4.target,multi-user.target
???? 5? ==> runlevel5.target,graphical.target??? 圖形模式
???? 6? ==> runlevel6.target,reboot.target???????? 重啟模式
級別切換:
init N ==> systemctl isolate name.target
查看級別:
runlevel ==> systemctl list-units –type target
獲取默認運行級別:
/etc/inittab ==> systemctl get-default
修改默認級別:
/etc/inittab ==> systemctl set-default name.target
切換至emergency模式:
systemctl emergency
其它常用命令:
關機:systemctl halt、systemctl poweroff
重啟:systemctl reboot
掛起:systemctl suspend
快照:systemctl hibernate
快照并掛起:systemctl hybrid-sleep
?
回顧:bash腳本編程、systemd
函數:模塊化編程
一種 : funtion f_name{
函數體…….
}
二種:f_name() {
函數體…..
}
return命令:
參數
函數體中調用參數:$1,$2,…函數名 參數列表
向函數傳遞參數:
函數名 參數列表
?
systemd: 系統及服務
unit:
?????? 類型:service,target
???????????????? .service,.target
systemctl
?
bash腳本編程:
變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間:
數組名
索引:編號從0開始:屬于數值索引:
注意:索引也可支持使用自定義的格式,而不僅僅是數值格式:
bash的數組支持稀疏格式:
?
引用數組中的元素:${ARRAY_NAME[INDEX]}
聲明數組:declare -a ARRAY_NAME
??? declare -A ARRAY_NAME:關聯數組
數組元素的賦值:
(1)一次只賦值一個元素:
ARRAY_NAME[INDEX]=VALUE
weekdays[0]=”Sunday”
weekdays[4]=”Thursday”
(2)一次賦值全部元素:
ARRAY_NAME=(“VAL1″”VAL2″”VAL3″…)
? (3)只賦值特定元素:
ARRAY_NAME=([0]=”VAL1″[3]=”VAL2 “…)
? (4)read -a ARRAY
?
引用數組元素:¥{ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下標為0的元素:
?
?
引用數組中的元素:
所有元素:¥{ARRAY[@]},${ARRAY[*]}
?
${ARRAY[@]:offset:number}
offset:要跳過的元素個數
number:要取出的元素個數,偏移量之后的所有元素${ARRAY[@]:offset}:
?
向數組中追加元素:
ARRAY[${#ARRAY[*]}]
刪除數組中的某元素:
unset ARRAY[INDEX]
關聯數組:
declare -A ARRAY_NAME
ARRAY_NAME=([index_name1])=’val1′ [index_name2]=’val2′ …)
?
練習:生成10個隨機數,升序或降序排序:
?
bash的字符串處理工具:
字符串切片:
??????? ${var:offset:number}
??????? 取字符串的最右側幾個字符:${var: -lengh}
?????????????????????? 注意:冒號后必須有一空白字符:
?
基于模式取子串:
${var#*word}:其中word可以是指定的任意字符:功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word,刪除字符串開頭至第一次出現word字符之間的所有字符:
${var##*word}:同上,不過,刪除的是字符串開頭至最后一次由word指定的字符之間的所有內容:
${var%word*}:其中word可以是指定的任意字符:功能:自右而左,查找var之間的所有字符:變量所存儲的字符串中,第一次出現的word,刪除字符串最后一個字符向左至第一次出現word字符
file=”/var/log/messages”
${file%/*}:/var/log
${var%%word*}:同上,只不過刪除字符串最右側的字符向左最后一次出現word字符之間的所有字符:
?????? 示例:
url=http://www.ahoiyf.live:80
???? ${url##*:}
???? ${url%%:*}
?
查找替換:
${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之:
${var//pattern/substi}:查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之:
${var/#pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之:
${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之:
?
查找并刪除:
${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串
${var//pattern}:查找var所表示的字符串中,刪除所有被pattern所匹配到的字符串
?
字符大小寫轉換:
?????? ${var^^}:把var中的所有小寫字母轉換為大寫:
${var,,}:把var中的所有大寫字母轉換為小寫:
?
變量賦值
${var:-value}:如果var為空或未設置,那么返回value:否則,則返回var的值:
{var:=value}:如果var為空或未設置,那么返回value,并將value的值賦值給var:否則,則返回var的值:
${var:+value}:如果var不空,則返回value:否則,則返回var的值:
${var:?error_info}:如果var為空或未設置,那么返回error_info:否則,則返回var的值:
?
為腳本程序配置文件:
(1)定義文本文件,每行定義“name=value
(2)在腳本中source此文件即可
?
命令:
mktemp命令:
?
mktemp [OPTION]…[TEMPLATE]
TEMPLATE:filename.XXX
XXX.至少要出現三個:
OPTION:
-d:創建臨時目錄:
–tmpdir=/PATH/TO/SOMEDIR:指明臨時文件目錄位置:
?
install命令:
install [OPTION]… [-T] SOURCE DEST
install [OPTION]… SOURCE…? DIRECTORY
install [OPTION]… -t DIRECTORY SOURCE
install [OPTION]… -d DIRECTORY…
選項:
-m MODE
-o OWNER
-G GROUP

相關新聞

聯系我們

400-080-6560

在線咨詢:點擊這里給我發消息

郵件:[email protected]

工作時間:周一至周日,09:00-18:30

QR code
云南快乐10分开奖直播