Linux(二十一)Shell編程

来源:https://www.cnblogs.com/leeqico/archive/2018/05/11/9026247.html
-Advertisement-
Play Games

21.1 為什麼要學習Shell編程 (1)Linux運維工程師在進行伺服器集群管理時,需要編寫Shell程式來進行伺服器管理。 (2)對於JavaEE和Python程式員來說,工作的需要,你的老大會要求你編寫一些Shell腳本進行程式或者是伺服器的維護,比如編寫一個定時備份資料庫的腳本。 (3)對 ...


21.1 為什麼要學習Shell編程

(1)Linux運維工程師在進行伺服器集群管理時,需要編寫Shell程式來進行伺服器管理。

(2)對於JavaEE和Python程式員來說,工作的需要,你的老大會要求你編寫一些Shell腳本進行程式或者是伺服器的維護,比如編寫一個定時備份資料庫的腳本。

(3)對於大數據程式員來說,需要編寫Shell程式來管理集群。

21.2 Shell是什麼

Shell是一個命令行解釋器,它為用戶提供了一個向Linux內核發送請求以便運行程式的界面系統級程式,用戶可以用Shell來啟動、掛起、停止甚至是編寫一些程式。

21.3 Shell編程快速入門

    21.3.1 腳本格式要求

    (1)腳本以#!/bin/bash開頭

    (2)腳本需要可執行許可權

    21.3.2 編寫第一個Shell腳本

    創建一個Shell腳本,輸出hello world!


 

    21.3.3 腳本的常用執行方式

    方式一(輸入腳本的絕對路徑或相對路徑)

    (1)首先要賦予myShell.sh腳本x許可權

    (2)執行腳本


 

    方式二(sh+腳本),不推薦

    說明:不用賦予腳本x許可權,直接執行即可


 

21.4 shell的變數

    21.4.1 shell變數的介紹

    (1)Linux Shell中的變數分為,系統變數和用戶自定義變數。

    (2)系統變數:$HOME、$PWD、$SHELL、$USER等等。

    (3)顯示當前shell中所有變數:set

    21.4.2 shell變數的定義

    基本語法

    (1)定義變數:變數=值

    (2)撤銷變數:unset 變數

    快速入門

(1)定義變數A

(2)撤銷變數A

(3)聲明靜態的變數B=2,不能unset


 
 

    21.4.3 定義變數的規則

    (1)變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。

    (2)等號兩側不能有空格。

    (3)變數名稱一般習慣為大寫。

    21.4.4 將命令的返回值賦給變數(重點)

(1)C = `ls -l /home`反引號,運行裡面的命令,並把結果返回給變數C

(2)D=$(date)等價於反引號


 
 

21.5 設置環境變數

21.5.1 基本語法

(1)export 變數名=變數值 (將shell變數輸出為環境變數)

(2)source 配置文件 (讓修改後的配置信息立即生效)

(3)echo $變數名 (查詢環境變數的值)

21.5.2 快速入門

(1)在/etc/profile文件中定義TOMCAT_HOME環境變數


 

(2)查看環境變數TOMCAT_HOME的值

註意:在輸出TOMCAT_HOME環境變數前,需要讓其生效


 

(3)在另外一個shell程式中使用TOMCAT_HOME


 
 

21.6 位置參數變數

21.6.1 介紹

當我們執行一個shell腳本時,如果希望獲取到命令行的參數信息,就可以使用到位置參數變數,比如:./myshell.sh 100 200,這個就是一個執行shell的命令行,可以在myshell腳本中獲取參數信息。

21.6.2 基本語法

$n(n為數字,$0代表命令本身,$1-$9代表第一到第九個參數,十以上的參數需要用大括弧包含,如${10})

$*(這個變數代表命令行中所有的參數,$*把所有的參數看成一個整體)

$@(這個變數也代表命令行中所有的參數,不過$@把每個參數區分對待)

$#(這個變數代表命令行中所有參數的個數)

21.6.3 位置參數變數應用實例

編寫一個shell腳本positionPara.sh,在腳本中獲取到命令行的各個參數信息


 
 

21.7 預定義變數

就是shell設計者事先已經定義好的變數,可以直接在shell腳本中使用。

$$(當前進程的進程號(PID))

$!(後臺運行的最後一個進程的進程號(PID))

$?(最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個參數,由命令自己決定),則證明上一個命令執行不正確了。)


 

21.8 運算符

(1)“$((運算式))”或“$[運算式]”

(2)expr m + n 註意expr運算符間要有空格(+,-,*,/,%)


 

21.9 條件判斷

[ condition ](註意condition前後要有空格)

#非空返回true,可使用$?驗證(0為true,>1為false)

(1)兩個整數的比較

= 字元串比較

-lt 小於

-le 小於等於

-eq 等於

-gt 大於

-ge 大於等於

-ne 不等於

(2)按照文件許可權進行判斷

-r 有讀的許可權【-r 文件】

-w 有寫的許可權

-x 有執行的許可權

(3)按照文件類型進行判斷

-f 文件存在並且是一個常規的文件

-e 文件存在

-d 文件存在並且是一個目錄


 
 

21.10 流程式控制制

21.10.1 if判斷

if [ 條件判斷式 ]
then
    程式
elif [ 條件判斷式 ]
then
    程式
fi

註意事項:[ 條件判斷式 ],中括弧和條件判斷式之間必須有空格


 
 

21.10.2 case語句

case $變數名 in

"值1")

如果變數的值等於值1,則執行程式1

;;

"值2")

如果變數的值等於值2,則執行程式2

;;*)

如果變數的值都不是以上值,則執行此程式

;;

esac


 
 

21.10.3 for迴圈

基本語法1:

for 變數 in 值1 值2 值3...

do

    程式

done


 
 

基本語法2:

for((初始值;迴圈控制條件;變數變化))

do

    程式

done


 
 

21.10.4 while迴圈

while [ 條件判斷式 ]

do

    程式

done


 
 

21.11 read讀取控制台輸入

read(選項)(參數)

選項:

-p:指定讀取值時的提示符;

-t:指定讀取值時等待的時間(秒),如果沒有在指定時間內輸入,就不再等待了。

參數

變數:指定讀取值的變數名


 
 

21.12 函數

shell編程和其他編程語言一樣,有系統函數,也可以自定義函數。

系統函數

basename(返回完整路徑最後/的部分,常用於獲取文件名)

basename [pathname] [suffix]

basename [string] [suffix]

suffix為尾碼,如果suffix被指定了,basename會將pathname或string中的suffix去掉。

dirname(返回完整路徑最後/的前面部分,常用於返回lu路徑部分)

dirname    文件絕對路徑(從給定的包含絕對路徑的文件名中去除文件名(非目錄的部分),然後返回剩下的路徑(目錄的部分))


 

自定義函數

[function] funname[()]

{

    Action;

    [return int;]

}

調用直接寫函數名:funname    [值]


 
 

21.13 Shell編程綜合案例

需求分析:

(1)每天凌晨2:10備份資料庫DB1到/data/backup/db

(2)備份開始和備份結束能夠給出相應的提示信息

(3)備份後的文件要求以備份時間為文件名,並打包成.tar.gz的形式,比如2018-05-04_154833.tar.gz

(4)在備份的同時,檢查是否有10天前備份的資料庫文件,如果有就將其刪除。

腳本代碼如下(mysql_db_backup.sh):

#!/bin/bash

#完成資料庫的定時備份。

#備份的路徑

BACKUP=/data/backup/db

#當前的時間作為文件名

DATETIME=$(date +%Y_%m_%d_%H%M%S)

#可以輸出變數調試

#echo ${DATETIME}

echo "=======開始備份========"

echo "=======備份的路徑是 $BACKUP/$DATETIME.tar.gz"

#主機

HOST=localhost

#用戶名

DB_USER=root

#密碼

DB_PWD=123456

#備份資料庫名

DATABASE=DB1

#創建備份的路徑

#如果備份的路徑文件夾存在,就使用,否則就創建

[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"

#執行mysql的備份資料庫的指令

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 "=====備份文件成功==========="

註意:

有時候安裝好MySQL程式的時候,直接輸入命令mysql或mysqldump會發現提示命令不存在,這是由於系統預設會查找/usr/bin下的命令,如果這個命令不在這個目錄下,當然會找不到命令

解決方法;

首先得知道mysql命令或mysqldump命令的完整路徑,可以使用find命令查找

find  / -name mysql -print

比如mysql的路徑是:/usr/local/mysql/bin/mysql,然後映射一個鏈接到/usr/bin目錄下,相當於建立一個鏈接文件

ln -s /usr/local/mysql/bin/mysql /usr/bin


 
 
 
 
 

關註公眾號:Java後端生活,乾貨文章第一時間送到!


 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有些項目尤其是WinForm或者是WPF項目,針對一些工具形式的小項目,不想軟體流出去之後,懂程式的的拿到手之後一看配置文件就知道了我們資料庫的用戶名和密碼,如果外網能訪問的話,那就麻煩大了。所以這裡為了防止項目外泄之後這些信息不被別人看到,我們就需要對鏈接字元串或者其他重要信息進行加密,用的時候在 ...
  • 比如Json.NET的JObject明明實現了IEnumerable<T>,具體來說是IEnumerable<KeyValuePair<string, JToken>>,按說JObject類型的對象是可以直接調用Select、Where等linq擴展方法的,但偏偏就是不行,代碼如下: 究竟是人性的扭 ...
  • 經緯度轉換為詳細地址信息 參考文檔:http://lbs.qq.com/webservice_v1/guide-gcoder.html 首先申請key,如果使用的是服務端請求webservice API ,申請密鑰的時候要選擇“服務端”,創建成功之後設置ip白名單,否則預設全部ip都可以使用的你的k ...
  • 本篇承接上篇內容,如果你不小心點擊進來,建議從第一篇開始完整閱讀,文章內容繼承性連貫性。 構建NetCore應用框架之實戰篇系列 一、簡介 1、登錄功能完成後,框架的雛形已經形成,有必要進行複習。 2、本篇簡單對框架代碼進行一些解釋。同時可以簡單理解框架的規範。 二、目錄結構規範 1、直接上圖,目錄 ...
  • C# 虹軟SDK視頻人臉識別和註冊 居然收到10元打賞,還不知道誰乾的,其實更好(自認為)的demo在https://github.com/catzhou2002/ArcFaceDemo 截屏留念: 當然,謝謝!謝謝鼓勵! ...
  • ARM Linux驅動篇 學習溫度感測器ds18b20的驅動編寫過程 原文地址: "http://www.cnblogs.com/NickQ/p/9026545.html " 一、開發板與ds18b20的入門 ds18B20是常用的數字溫度感測器,具有體積小,硬體開銷低,抗干擾能力強,精度高的特點。 ...
  • 訪問其官網,https://www.centos.org/,點擊Get CentOS Now,點擊alternative downloads,點擊CentOS 7列表中的x86_64,點擊http://mirrors.163.com/centos/7/isos/x86_64/,裡邊有幾個不同的版本。 ...
  • 系統環境:Windows 10 Pro 軟體版本:VMware 12 Pro 安裝鏡像:CentOS-7-x86_64-Everything-1804.iso 下載地址:https://www.centos.org/download/ 1.點擊創建新的虛擬機,選擇典型。 2.單擊瀏覽並選擇鏡像文件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...