亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

Linux基礎(chǔ)教程之bash腳本進(jìn)階

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

在函數(shù)體當(dāng)中,可使用$1,$2,….調(diào)用這些參數(shù):還可以使用$@,$*,$#等特殊變量:

變量作用域:指的它的生效范圍
???????????????????? 本地變量:當(dāng)前shell進(jìn)程:為了執(zhí)行腳本會啟動專用的shell進(jìn)程:因此,本地變量的作用范圍是shell腳本程序文件:
局部變量:函數(shù)的生命周期:函數(shù)結(jié)束時變量被自動銷毀
如果函數(shù)中有局部變量,其名稱同本地變量:
?
在函數(shù)中定義局部變量的方法:
local NAME=VALUE
?
函數(shù)遞歸:
?????? 函數(shù)直接或間接調(diào)用自身:
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
練習(xí):求n階斐波那契數(shù)列:
#!/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新特性:
系統(tǒng)引導(dǎo)時實現(xiàn)服務(wù)并行啟動:
按需激活進(jìn)程:
系統(tǒng)狀態(tài)快照:
基于依賴關(guān)系定義服務(wù)控制邏輯:
?
核心概念:unit
??????? 配置文件進(jìn)行標(biāo)識和配置:文件中主要包含了系統(tǒng)服務(wù)、監(jiān)聽socket、保存的系統(tǒng)快照以及其它與init相關(guān)的信息:保存至:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
?
Unit的類型:
Service unit: 文件擴展名為.service,用于定義系統(tǒng)服務(wù):
Target unit:文件擴展名為。target,用于模擬實現(xiàn)“運行級別”:
Device unit: .mount , 定義文件系統(tǒng)掛載點:
Socket unit:.socket ,用于標(biāo)識進(jìn)程間通信用的socket文件:
Swap unit :.swap , 用于標(biāo)識swap設(shè)備:
Automount unit: .autoount,文件系統(tǒng)的自動掛載點:
Path unit :.path , 用于定義文件系統(tǒng)中的一個文件或目錄:
?
關(guān)鍵特性:
基于socket的激活機制:socket與服務(wù)程序分離:
基于bus的激活機制:
基于device的激活機制:
基于path的激活機制:
系統(tǒng)快照:保存各unit的當(dāng)前狀態(tài)信息于持久存儲設(shè)備中:
向后兼容sysv init腳本:
?
不兼容
systemctl命令固定不變
非由systemd啟動的服務(wù),systemctl無法與之通信
?
管理系統(tǒng)服務(wù):
CentOS 7: service unit
注意:能兼容早期的服務(wù)版本
?
命令: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
狀態(tài):service name status ==> systemctl status name.service
條件式重啟:service name condrestart ==> systemctl? try-restart name.service
重載或重啟服務(wù):systemctl reload-or-restart name.service
重載或條件式重啟服務(wù):systemctl reload-or-try-restart name.service
禁止設(shè)定為開機自啟:systemctl? mask name.service
取消禁止設(shè)定為開機自啟:systemctl unmask name.service
?
查看某服務(wù)當(dāng)前激活與否的狀態(tài):chkconfig –list name ==> systemctl is-active name.service
查看所有已經(jīng)激活的服務(wù):
systemctl list-units –type service
查看所有服務(wù):
systemctl list-units –type service –all
學(xué)習(xí)Linux主要后期都是實現(xiàn)服務(wù)管理類,所以這些服務(wù)管理類的命令要記清。
?
chkconfig命令的對應(yīng)關(guān)系:
設(shè)定某服務(wù)開機自啟:chkconfig name on ==> systemctl enable name.service
禁止:chkconfig name off ==> systemctl disable name.service
查看所有服務(wù)的開機自啟狀態(tài)
chkonfig –list ==> systemctl list-unit-files –type service
?
target units:
unit配置文件:.target
運行級別:
???? 0 ==> runlevel0.target,poweroff.target?? 這兩種設(shè)定為關(guān)機
???? 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
獲取默認(rèn)運行級別:
/etc/inittab ==> systemctl get-default
修改默認(rèn)級別:
/etc/inittab ==> systemctl set-default name.target
切換至emergency模式:
systemctl emergency
其它常用命令:
關(guān)機:systemctl halt、systemctl poweroff
重啟:systemctl reboot
掛起:systemctl suspend
快照:systemctl hibernate
快照并掛起:systemctl hybrid-sleep
?
回顧:bash腳本編程、systemd
函數(shù):模塊化編程
一種 : funtion f_name{
函數(shù)體…….
}
二種:f_name() {
函數(shù)體…..
}
return命令:
參數(shù)
函數(shù)體中調(diào)用參數(shù):$1,$2,…函數(shù)名 參數(shù)列表
$*,$@,$#
向函數(shù)傳遞參數(shù):
函數(shù)名 參數(shù)列表
?
systemd: 系統(tǒng)及服務(wù)
unit:
?????? 類型:service,target
???????????????? .service,.target
systemctl
?
bash腳本編程:
變量:存儲單個元素的內(nèi)存空間
數(shù)組:存儲多個元素的連續(xù)的內(nèi)存空間:
數(shù)組名
索引:編號從0開始:屬于數(shù)值索引:
注意:索引也可支持使用自定義的格式,而不僅僅是數(shù)值格式:
bash的數(shù)組支持稀疏格式:
?
引用數(shù)組中的元素:${ARRAY_NAME[INDEX]}
聲明數(shù)組:declare -a ARRAY_NAME
??? declare -A ARRAY_NAME:關(guān)聯(lián)數(shù)組
數(shù)組元素的賦值:
(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
?
引用數(shù)組元素:¥{ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下標(biāo)為0的元素:
?
?
引用數(shù)組中的元素:
所有元素:¥{ARRAY[@]},${ARRAY[*]}
?
${ARRAY[@]:offset:number}
offset:要跳過的元素個數(shù)
number:要取出的元素個數(shù),偏移量之后的所有元素${ARRAY[@]:offset}:
?
向數(shù)組中追加元素:
ARRAY[${#ARRAY[*]}]
刪除數(shù)組中的某元素:
unset ARRAY[INDEX]
關(guān)聯(lián)數(shù)組:
declare -A ARRAY_NAME
ARRAY_NAME=([index_name1])=’val1′ [index_name2]=’val2′ …)
?
練習(xí):生成10個隨機數(shù),升序或降序排序:
?
bash的字符串處理工具:
字符串切片:
??????? ${var:offset:number}
??????? 取字符串的最右側(cè)幾個字符:${var: -lengh}
?????????????????????? 注意:冒號后必須有一空白字符:
?
基于模式取子串:
${var#*word}:其中word可以是指定的任意字符:功能:自左而右,查找var變量所存儲的字符串中,第一次出現(xiàn)的word,刪除字符串開頭至第一次出現(xiàn)word字符之間的所有字符:
${var##*word}:同上,不過,刪除的是字符串開頭至最后一次由word指定的字符之間的所有內(nèi)容:
${var%word*}:其中word可以是指定的任意字符:功能:自右而左,查找var之間的所有字符:變量所存儲的字符串中,第一次出現(xiàn)的word,刪除字符串最后一個字符向左至第一次出現(xiàn)word字符
file=”/var/log/messages”
${file%/*}:/var/log
${var%%word*}:同上,只不過刪除字符串最右側(cè)的字符向左最后一次出現(xiàn)word字符之間的所有字符:
?????? 示例:
url=http://www.vfuj.cn: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所匹配到的字符串
?
字符大小寫轉(zhuǎn)換:
?????? ${var^^}:把var中的所有小寫字母轉(zhuǎn)換為大寫:
${var,,}:把var中的所有大寫字母轉(zhuǎn)換為小寫:
?
變量賦值
${var:-value}:如果var為空或未設(shè)置,那么返回value:否則,則返回var的值:
{var:=value}:如果var為空或未設(shè)置,那么返回value,并將value的值賦值給var:否則,則返回var的值:
${var:+value}:如果var不空,則返回value:否則,則返回var的值:
${var:?error_info}:如果var為空或未設(shè)置,那么返回error_info:否則,則返回var的值:
?
為腳本程序配置文件:
(1)定義文本文件,每行定義“name=value
(2)在腳本中source此文件即可
?
命令:
mktemp命令:
?
mktemp [OPTION]…[TEMPLATE]
TEMPLATE:filename.XXX
XXX.至少要出現(xiàn)三個:
OPTION:
-d:創(chuàng)建臨時目錄:
–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

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評如潮的Linux云計算運維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機構(gòu)!