❶ Shell腳本編程實戰
做 Java 的肯定都接觸過 linux 系統,那麼很多時候我們在開發的過程中都是把我們項目打成一個jar包,或者是war包的形式,然後通過 XFTP 上傳到我們伺服器的指定目錄,然後運行一端啟動腳本,讓我們的項目變得可以訪問 就像 ./sh service.sh start 然後啟動我們寫好的 sh 的shell腳本。接下來我們就來學習一下關於 Shell 腳本是如何寫出來的。
Shell 腳本是什麼?Shell是一個命令解釋器,它的作用是解釋執行用戶輸入的命令及程序等,也就是說,我們用戶每輸入一條命令,Shell 就會相對應的執行一條命令。當命令或程序語句不在命令行下執行,而是通過一個程序文件來執行時,該程序文件就被稱為Shell腳本。
在我們的 Shell 腳本中,會有各種各樣的內容,賦值,計算,循環等一系列的操作,接下來我們就來看看這個 Shell 腳本怎麼寫吧
1.查看自己當前系統默認的 Shell
echo $SHELL
輸出:/bin/bash
2.查看系統支持的Shell
cat /etc/shells
輸出:
/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
也就是說,我們的雲伺服器是支持我們在這里給他安排 Shell 腳本的
我們這時候先來安排一下 sh 的文件,創建一個文件夾,然後在其中創建一個 sh 的文件。
mkdir /usr/local/shelltest
touch test.sh
創建完成我們編輯一下內容
vim test.sh
然後我們出來運行一下我們的 Shell 的第一個腳本
bash test.sh
出來的結果是 Hello World Shell
一個及其簡單的腳本出現了,接下我們就分析一波我們寫了點啥?
#!/bin/bash
#! 是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell
我們在之前也使用了 echo $SHELL 來查看了自己系統默認的是哪一種 sh 解析器,之前看到的是/bin/bash,所以我們在寫 Shell 腳本的時候,我們在開頭默認的約定中,我們寫了這個是用 /bin/bash 來進行解釋的,
那麼我們如何像之前調用我們的當前目錄中的 Shell 腳本一樣去調用他呢?就像這個樣子的 ./sh service.sh start
1.授權,
我們先不授權試一下看看能通過 ./test.sh 進行調用么
bash: ./test.sh: Permission denied 會提示這個,也就是沒有授權定義,
授權命令:chmod +x test.sh
2.執行 ./test.sh
然後調用就能正常輸出了,就是說,在當前的目錄下執行這個腳本命令。
變數命名實際上很簡單,我們先來試一下
name=yikeji
這時候我們怎麼使用變數呢?實際上只要在前面加上一個符號就可以 $
echo $name
上面的兩種寫法都是可以的,外面的大括弧加和不加區別不大,可以省略,直接就 $name 就可以使用你定義的變數
使用括弧的意義一般在於區別某些變數,比如你寫了一串的內容,可能寫的是 echo $nameismyfriend ,如果連在一起,是不是有點尷尬,這時候就可以使用括弧區別一下, echo ${name}ismyfriend 不使用括弧的時候,他就去找nameismyfriend這個變數了,就無法出來我們要的效果。
unset name
這時候我們就把我們剛才定義的 name=yikeji 這個變數給去掉了,我們可以調用一下我們的變數看是什麼?
echo $name
這是不是就證明我們自己定義的變數已經刪除了
那麼我們需要一個關鍵字,大家肯定能想到是什麼關鍵字 readonly
我們先給name賦值,然後使用 readonly 設置只讀,然後再改變一下試試,
竟然是真的,如果不設置只讀,是不是會重新可以進行賦值,我們測試個年齡,
所以我們就可以肯定,readonly就是設置只讀的關鍵詞,記住了么?
那麼設置只讀的變數可以刪除么?畢竟總有杠精的面試官會提問這個棘手的問題,但是,阿粉試過的所有方式好像都是不行的,阿粉就直接重啟了自己的伺服器,這樣臨時的變數就不存在了!
說真的,Shell腳本的流程式控制制數一般才是yyds,為什麼這么說,因為你在寫大部分的腳本的時候,流程式控制制的地方永遠是最多的,判斷,選擇,等等一系列的函數,當時熟練使用的時候,就發現這東西確實很有意思。
我們先說最簡單的 if else 這也是我們最經常使用的判斷,在寫 Shell 腳本的時候,就不像我們的 Java 中直接寫
Xshell 中的語法就不是這個樣子的, Xshell 語法:
末尾的 fi 就是 if 倒過來拼寫,我們可以寫一個 if 的腳本試一下這個流程能否理解。
這里申明一下,
我們在上面這段腳本中寫就是內容就是,我們給腳本傳入一個值,然後比對這個值和2的大小關系,然後輸出我們指定的內容。
運行後就能看到
$1 表示我們給 Shell 腳本輸入的第一個參數, $0 就是你寫的shell腳本本身的名字,$2 是我們給 Shell 腳本傳的第二個參數
大家在部署某些項目的時候,是不是啟動命令就很簡潔,就是 sh service.sh start 類似這種的,那我們來看看一般這種是怎麼寫的,這就用到了另外一塊的內容,和 if 類似,在 Java 中也有,那就是 Case .
我們先來看看 Case 的語法,
case ... esac 實際上就和 Java 中的 Case 是非常相似的,case 語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令. esac 是一個結束的標志。
光說不練,假把式,我們來搞一下試試寫一個腳本來搞一下。就用我們剛才說的 sh servic.sh start 來進行測試。
我們來看看運行結果
那麼這段 Shell 腳本是什麼意思呢?其實很簡單,匹配我們傳入的第一個字元,和 start 還有 stop 進行比較,如果匹配上之後,輸出命令,最後退出即可。
是不是感覺沒有那麼復雜了呢?
說到流程式控制制,那麼肯定不能不說 for , 畢竟 for 循環在 Java 中那可是重頭戲。
我們先看他的格式
那麼我們有沒有說像是 Java 中那種 for 循環一樣的方式呢?比如說這個 for ((i=1; i<=j; i++))
實際上也是支持這種的,我們來寫一個試試。
執行一下看看
既然有 for 那是不是就有 while 呢?是的,沒錯,確實是有 while ,也是循環的意思,但是寫法有略微不一樣的地方
我們來舉個嘗試列印九九乘法表來看一下
是不是也挺簡單的?
其實 Shell 腳本的編寫一般都是在實際應用中提升,單純的寫測試腳本,也是可以讓自己對知識的掌握比較充分,而我們一般都是寫一些比較簡單的腳本,復雜的不是還有運維么?
❷ 如何使用shell腳本每天自動備份mysql資料庫
mysql備份用自帶的備份工具mysqlmp
每天自動執行用cron工具,把mysql的備份命令放在賀空襪虧碰.sh文件裡面
.sh文件放在禪激/etc/cron.daily目錄,就會每天自動執行了。
❸ shell腳本telnet登陸交換機備份配置
#!/bin/bash
export datetime='date +%Y%m%d'
export BAKTIME=`date +%Y%m%d%H%M%S`
export user="admin"
export password="admin"
export back="dis cu"
export BAK_DIR=/back/h3c
for i in $(cat ip_file)
do
{
echo $user;
sleep 1;
echo $password;
sleep 1;
echo $back;
sleep 1;
echo " ";
sleep 5;
}|telnet $i > $BAK_DIR/$i-$BAKTIME.log
done
mkdir $BAK_DIR/H3C_$datetime
mv *-$datetime* H3C_$datetime
注釋
####################################
export BAKTIME=`date +%Y%m%d%H%M%S` 輸出系統時間
export user="admin" 此用戶為交換機、路由器用戶名
export password="admin" 此密碼為交換機、路由器密碼
export back="dis cu" 此唯埋兄命令為查看H3C交換機配置
export BAK_DIR=/home/erp/back/h3c 此目錄是linux伺服器備份交換機、路由器的存放目錄
cat ip_file 此命令意思是查看ip_file文件中的內容,逐行查看
####################################
ip_file 文件添加交換機IP(注意:不要加雙引號, 文件與腳本在指襲同一目錄下液沒存放)
#以下為交換機、路由器IP地址
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.7
❹ 編寫一個shell腳本每天16:30備份mysql數據並壓縮打包(打包文件按照當天日期命名)放到/root/data下
#!/bin/bash
date=$(date-d'+0days''+%Y-%m-%d')#聲明一個變數,並賦值當天日期
cd/root/data#進入目錄
mkdir$date#創建目錄
mysqlmp-uusername-ppassworddb_name>$date"db_name.sql"#資料庫備份,修改用戶名密碼,還有要備份資料庫
tar-zcf$date".tar.gz"$date#壓縮打包
rm-rf$date#刪除源數據
保存為bak.sh,每天16:30備份定時任務,沒有crontab命令:yum install vixie-cron
chmod +x /.../bak.sh
crontab -e
30 16 * * * /.../bak.sh
❺ 設計一個shell腳本程序,要求有如下功能: 實現自動備份功能和清理備份等
#!/bin/bash
TIME=`date+%Y%m%d|cut-b3-8`
#question1
tar-zcvf/home/bak/VAR_$TIME_BAK.gzip/var
#question2
ls螞基拆-l/var>>/home/bak/VAR_$TIME_BAK.log
#question3
find/home/bak-name'*gzip'-mtime+1|xargsrm-rf
腳本名字悶棗backup.sh,放到/root下,然後用root創建cronjob
0 12 * * * /root/backup.sh
#question 4 (以redhat為例)
echo " /root/backup.sh " >> /etc/rc.local
#question 5
把下列代碼寫入cronjob中
#!/bin/bash
TIME=`date+%Y"/"%m"/"%d""%H":"%m`
if[-f/home/shell.log]
then
echo"$TIMErunning">/home/tmp.log
cat/home/shell.log>>/home/tmp.log
mv鋒掘/home/tmp.log/home/shell.log
else
touch/home/shell.log
fi
腳本名字status.sh,放到/root下 (寫的有點小問題,功能執行沒問題)
0 * * * * /root/status.sh
❻ shell腳本怎麼實現日誌備份到本地Linux系統
把日誌打包,壓縮,拉取到本地