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