無錫網(wǎng)站制作的公司小紅書推廣怎么收費(fèi)
Linux 之 shell 腳本
- 1、腳本的格式要求
- 2、shell 腳本常用執(zhí)行方式
- 2.1、絕對(duì)路徑或相對(duì)路徑方式
- 2.2、sh+腳本方式(不推薦)
- 3、shell 的變量
- 3.1、定義 shell 變量
- 3.2、將命令返回值賦值給變量 (重點(diǎn))
- 3.3、設(shè)置環(huán)境變量
- 3.4、位置參數(shù)變量
- 3.5、預(yù)定義變量
- 4、運(yùn)算符
- 5、條件判斷
- 6、流程控制
- 6.1、if 判斷
- 6.2、case 語句
- 6.3、for 循環(huán)
- 6.4、while 循環(huán)
- 7、read 讀取控制臺(tái)輸入
- 8、函數(shù)
- 8.1、常用系統(tǒng)函數(shù) basename
- 8.2、常用系統(tǒng)函數(shù) dirname
- 8.3、自定義函數(shù)
- 9、shell 綜合案例
?
???????shell 是一個(gè)命令行解釋器,它為用戶提供了一個(gè)向 linux 內(nèi)核發(fā)送請(qǐng)求,以便運(yùn)行程序的界面系統(tǒng)級(jí)程序。用戶可以使用 shell 來啟動(dòng)、掛起、停止甚至編寫一些程序。
?
1、腳本的格式要求
-
①、腳本以
#!/bin/bash
開頭。 -
②、腳本需要有可執(zhí)行權(quán)限。
?
2、shell 腳本常用執(zhí)行方式
?
2.1、絕對(duì)路徑或相對(duì)路徑方式
?
# 輸入shell 腳本的絕對(duì)路徑或相對(duì)路徑的方式,執(zhí)行shell腳本# 首先 需要對(duì) shell 腳本 賦執(zhí)行權(quán)限
chmod 744 test_shell.sh
# 相對(duì)路徑的方式執(zhí)行
./test_shell.sh
# 絕對(duì)路徑的方式執(zhí)行
/usr/myshell/test_shell.sh
?
2.2、sh+腳本方式(不推薦)
?
使用該方式不需要 賦予shell腳本執(zhí)行權(quán)限,直接執(zhí)行即可。
sh ./test_shell2.sh
?
3、shell 的變量
?
shell 的變量分為:系統(tǒng)變量 和 用戶自定義變量。
-
系統(tǒng)變量: H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER 等
# 輸出系統(tǒng)變量 echo "path = $PATH" echo "user = $USER"
3.1、定義 shell 變量
?
# 定義變量: 變量=值,示例:
A=100
# 撤銷變量: unset 變量, 示例:
unset A
# 聲明靜態(tài)變量:readonly 變量。注意:靜態(tài)變量不能 unset。示例:
readonly B=101
# 把變量提升為全局環(huán)境變量,可供其他shell程序使用。
?
定義變量的規(guī)則
- ① 變量名稱可以由字母、數(shù)字和下劃線組成,但不能以數(shù)字開頭。
- 等號(hào)兩側(cè)不能有空格。
- 變量名稱一般習(xí)慣為大寫。
?
3.2、將命令返回值賦值給變量 (重點(diǎn))
?
# 兩種方式
# 方式一:反引號(hào),運(yùn)行里面的命令,并把結(jié)果返回給變量。示例:
A=`ls -la`
# 方式二:等同于反引號(hào)。示例:
A=$(ls -la)
?
3.3、設(shè)置環(huán)境變量
?
環(huán)境變量所在文件:
1.系統(tǒng)級(jí):
- ① /etc/profile:該文件是用戶登錄時(shí),操作系統(tǒng)定制用戶環(huán)境時(shí)使用的第一個(gè)文件,應(yīng)用于登錄到系統(tǒng)的每一個(gè)用戶。該文件一般是調(diào)用/etc/bash.bashrc文件。
/etc/bash.bashrc:系統(tǒng)級(jí)的bashrc文件。 - ② /etc/environment:在登錄時(shí)操作系統(tǒng)使用的第二個(gè)文件,系統(tǒng)在讀取你自己的profile前,設(shè)置環(huán)境文件的環(huán)境變量。
2.用戶級(jí)(這些文件處于家目錄下):
- ① ~/.profile:每個(gè)用戶都可使用該文件輸入專用于自己使用的shell信息,當(dāng)用戶登錄時(shí),該文件僅僅執(zhí)行一次!默認(rèn)情況下,他設(shè)置一些環(huán)境變量,執(zhí)行用戶的.bashrc文件。這里是推薦放置個(gè)人設(shè)置的地方
- ② ~/.bashrc:該文件包含專用于你的bash shell的bash信息,當(dāng)?shù)卿洉r(shí)以及每次打開新的shell時(shí),該該文件被讀取。不推薦放到這兒,因?yàn)?strong>每開一個(gè)shell,這個(gè)文件會(huì)讀取一次,效率肯定有影響。
~/.bash_profile or ~./bash_login:這里沒有引用作者的,下面會(huì)提到
~/.pam_environment:用戶級(jí)的環(huán)境變量設(shè)置文件,沒有做測(cè)試,不知道管不管用。
?
# 基本語法
# 將 shell 變量輸出為環(huán)境變量
export 變量名=變量值
# 讓修改后的配置信息立即生效
source 配置文件
# 查詢環(huán)境變量的值
echo $變量名# 示例:
export TOMCAT_HOME=/opt/tomcat
# 生效
source /etc/profile
?
3.4、位置參數(shù)變量
?
當(dāng)我們執(zhí)行一個(gè) shell 腳本時(shí),某些場(chǎng)景需要獲取到執(zhí)行 shell腳本的命令行參數(shù)信息,那么就可以使用位置參數(shù)變量。
基本語法:
命令 | 功能說明 |
---|---|
$n | n 為數(shù)字,$0 代表命令本身,$1- 9 代表第一個(gè)到第九個(gè)參數(shù),十以上的參數(shù)需要用大括號(hào)包含,例: 9 代表第一個(gè)到第九個(gè)參數(shù),十以上的參數(shù)需要用大括號(hào)包含,例: 9代表第一個(gè)到第九個(gè)參數(shù),十以上的參數(shù)需要用大括號(hào)包含,例:{10} |
$* | 代表命令行中所有的參數(shù),$*把所有的參數(shù)看成一個(gè)整體 |
$@ | @ 也代表命令行中所有的參數(shù),不過 @也代表命令行中所有的參數(shù),不過 @也代表命令行中所有的參數(shù),不過@把每個(gè)參數(shù)區(qū)分對(duì)待 |
$# | 代表命令行中所有參數(shù)的個(gè)數(shù) |
?
[root@myCentos6 zim]# vim test.sh#!/bin/bash
echo "獲取并打印命令行參數(shù)"
echo "$0 $1 $2"
echo "打印全部參數(shù): $*"
echo "打印全部參數(shù)-> $@"
echo "參數(shù)個(gè)數(shù) = $#"[root@myCentos6 zim]# ls -l
總用量 4
-rw-r--r--. 1 root root 154 8月 28 11:45 test.sh
[root@myCentos6 zim]# chmod 744 test.sh
[root@myCentos6 zim]# ls -l
總用量 4
-rwxr--r--. 1 root root 154 8月 28 11:45 test.sh
[root@myCentos6 zim]# ./test.sh aa 100
獲取并打印命令行參數(shù)
./test.sh aa 100
打印全部參數(shù): aa 100
打印全部參數(shù)-> aa 100
參數(shù)個(gè)數(shù) = 2
[root@myCentos6 zim]#
?
3.5、預(yù)定義變量
?
???????預(yù)定義變量,就是 shell 腳本設(shè)計(jì)者事先已經(jīng)定義好的變量,可以直接在shell腳本中使用。預(yù)定義變量是一開始執(zhí)行Script腳本時(shí)就會(huì)設(shè)定,且不能被修改,預(yù)定義變量當(dāng)一執(zhí)行程序時(shí)就有了。
基本用法:
-
$$ :當(dāng)前進(jìn)程的進(jìn)程號(hào)PID。
-
$! :后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程號(hào)pid。
-
$? :最后一次執(zhí)行的命令的返回狀態(tài)。如果這個(gè)變量的值為0,證明上一個(gè)命令正確執(zhí)行;如果這個(gè)變量的值為非0(具體是哪個(gè)數(shù)字,由命令自己決定),則證明上一個(gè)命令執(zhí)行錯(cuò)誤。
?
4、運(yùn)算符
?
# 基本語法
# 方式一: $((運(yùn)算式)) 示例:
RESULT=$((2+3)*4)
echo "result=$RESULT"
# 方式二: $[運(yùn)算式] 示例:
RESULT=$[(2+3)*4]
echo "result=$RESULT"
# 求兩個(gè)參數(shù)的和
SUM=$[$PARAM1+$PARAM2]
# 方式三: expr m+n 注意:expr 運(yùn)算符間要有空格
# expr \*,/,% 分別代表 乘,除,取余
TEMP=`expr 2 + 3`
RESULT=`expr $TEMP \* 4`
echo "result=RESULT"
?
5、條件判斷
?
# 判斷語句,基本語法. 注意:condition 前后要有空格
# 非空返回 true,可使用 $? 驗(yàn)證(0 為 true, >1 為 false)
[ condition ]
# 應(yīng)用實(shí)例: [ test_condition ] 返回true
[ test_condition ]
# [] 返回false
[]
# 條件滿足,執(zhí)行后面的語句
[ condition ] && echo "ok" || echo "not ok"# 案例:"ok 是否等于 ok"
if [ "ok100" = "ok" ]
then echo "equal"
fi# 案例:/root/install.log 目錄中的文件是否存在
if [ -e /root/install.log ]
then echo "文件存在"
fi
?
常用判斷條件
- 兩個(gè)整數(shù)的比較
- = 字符串比較
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- 按照文件權(quán)限進(jìn)行判斷
- -r 有讀的權(quán)限 [ -r 文件 ] (注意前后有空格)
- -w 有寫權(quán)限
- -x 有執(zhí)行權(quán)限
- 按照文件類型進(jìn)行判斷
- -f 文件存在并且是一個(gè)常規(guī)的文件
- -e 文件存在
- -d 文件存在并是一個(gè)目錄
?
6、流程控制
?
6.1、if 判斷
?
# 基本語法
if [ 條件判斷式 ];then程序
fi
# 或者 基本語法 (推薦使用)
if [ 條件判斷式 ]then程序elif [ 條件判斷式 ]then 程序fi
注意事項(xiàng):[ 條件判斷式 ] ,中括號(hào)和條件判斷式之間必須有空格。
?
6.2、case 語句
?
# 基本語法
case $變量名 in
"值1")如果變量的值等于值1,則執(zhí)行程序1;;
"值2") 如果變量的值等于值2,則執(zhí)行程序2;;… 省略其他分支 …
*)如果變量的值都不是以上的值,則執(zhí)行此程序;;
esac# 應(yīng)用示例:命令行參數(shù)是 1時(shí),輸出"周一",是2時(shí)輸出"周二",其他情況輸出"other"
#!/bin/bash
case $1 in
"1")echo "周一";;
"2")echo "周二";;
*)echo "other";;
esac
?
6.3、for 循環(huán)
?
# 基本語法1
for 變量 in 值1 值2 值3…do 程序done# 示例: 打印命令行輸入的參數(shù)
#!/bin/bash
for i in "$*"
doecho "the param is $i"
done
# 或
for j in "$@"doecho "the num is $j"
done # 基本語法2
for ((初始值;循環(huán)控制條件;變量變化))do 程序
done# 示例:從1加到100 的值,輸出顯示
#!/bin/bash
SUM=0
for((i=1.i<=100;i++))
do SUM=$[$SUM+$i]
done
echo "sum=$SUM"
?
6.4、while 循環(huán)
?
# 基本語法1
while[ 條件判斷式 ]
do 程序
done
# 應(yīng)用示例:從命令行輸入一個(gè)數(shù)n,統(tǒng)計(jì)從1+…+ n 的值是多少
#!/bin/bash
SUM=0
i=0
while[ $i -le $1 ]
doSUM=$[$SUM+$i]i=$[$i+1]
done
echo "sum= $SUM"
?
7、read 讀取控制臺(tái)輸入
?
# 基本語法
read [選項(xiàng)] [參數(shù)]
# 常用選項(xiàng)-p : 指定讀取值時(shí)的提示符-t : 指定讀取值時(shí)等待的時(shí)間(秒),如果沒有在指定的時(shí)間內(nèi)輸入,就不等待
# 常用參數(shù)變量:指定讀取值的變量名# 應(yīng)用實(shí)例1: 讀取控制臺(tái)輸入的 num 值 并打印
#!/bin/bash
read -p "請(qǐng)輸入一個(gè)數(shù)num1=" NUM1
echo "您輸入的值時(shí)num1=$NUM1"# 應(yīng)用實(shí)例2: 讀取控制臺(tái)輸入的 num 值,在10秒內(nèi)輸入,并打印
#!/bin/bash
read -t 10 -p "請(qǐng)輸入一個(gè)數(shù)num2=" NUM2
echo "您輸入的值時(shí)num2=$NUM2"
?
8、函數(shù)
?
shell 編程和其他編程語言一樣,有系統(tǒng)函數(shù),也可以自定義函數(shù)。
8.1、常用系統(tǒng)函數(shù) basename
?
# basename 函數(shù)功能:返回完整路徑最后 / 的部分,常用于獲取文件名
# suffix為后綴,如果suffix被指定了,basename會(huì)將pathname或string中的suffix去掉
basename [pathname] [suffix]
# 應(yīng)用示例: 返回/home/aaa/test.txt 的 "test"部分
basename /home/aaa/test.txt .txt
# 應(yīng)用示例: 返回/home/aaa/test.txt 的 "test.txt"部分
basename /home/aaa/test.txt
?
8.2、常用系統(tǒng)函數(shù) dirname
?
# dirname 函數(shù)功能:返回完整路徑最后 / 的前面部分,常用于返回路勁部分
# 從給定的包含絕對(duì)路徑的文件名中去除文件名(非目錄的部分),然后返回目錄部分。
dirname 文件絕對(duì)路徑# 應(yīng)用實(shí)例: 返回 /home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt
?
8.3、自定義函數(shù)
?
# 基本語法
[ function ] funname[()]
{Action;[return int;]
}
# 調(diào)用直接寫函數(shù)名: funname [值]# 應(yīng)用實(shí)例:計(jì)算輸入兩個(gè)參數(shù)的和 (read),getSum
#!/bin/bash
function getSum() {SUM=$[$n1+$n2]echo "sum=$SUM"
}read -p "請(qǐng)輸入第一個(gè)數(shù)n1" n1
read -p "請(qǐng)輸入第二個(gè)數(shù)n2" n2getSum $n1 $n2
?
9、shell 綜合案例
?
需求:
-
① 每天凌晨 2:10 備份數(shù)據(jù)庫 myDb 到 /data/backup/db
-
② 備份開始和備份結(jié)束,能夠給出相應(yīng)的提示信息
-
③ 備份后的文件要求以備份時(shí)間為文件名,并打包成 .tar.gz 的形式,比如:2023-08-28_230201.tar.gz
-
④ 在備份的同時(shí),檢查是否有10天前備份的數(shù)據(jù)庫文件,如果有就將其刪除。
在 /usr/sbin 目錄下創(chuàng)建 mysql_db_backup.sh 腳本
vim /usr/sbin/mysql_db_backup.sh
編寫 mysql_db_backup.sh 腳本
#!/bin/bash
# 備份的路徑
BACKUP=/data/backup/db
# 當(dāng)前的時(shí)間作為文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo "==開始備份數(shù)據(jù)庫myDb=="
echo "==備份的路徑是 $BACKUP/$DATETIME.tar.gz=="
# 主機(jī)
HOST=localhost
# 用戶名
DB_USER=root
# 密碼
DB_PWD=root
# 備份數(shù)據(jù)庫名稱
DATABASE=myDB
# 創(chuàng)建備份的路徑
# 如果備份的路徑文件夾存在就直接使用,否則就創(chuàng)建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
# 執(zhí)行 mysql 的備份數(shù)據(jù)庫的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
# 打包備份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
# 刪除臨時(shí)目錄
rm -rf $BACKUP/$DATETIME
# 刪除10天前的備份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "==備份文件成功=="
crontab 設(shè)置定時(shí)任務(wù)
10 2 * * * /usr/sbin/mysql_db_backup.sh
?
?
?
?
?
?
?
.