shell腳本一

来源:http://www.cnblogs.com/jasmine-Jobs/archive/2016/08/31/5824257.html
-Advertisement-
Play Games

在一些複雜的Linux維護工作中,大量重覆的輸入和交互操作不但費時費力,容易出錯.這時候就需要用到腳本。 編寫腳本的好處: 批量的處理,自動化的完成維護,減輕管理員的負擔。 linux的shell腳本是一種特殊的應用程式,常見的shell解釋器有很多種,使用不同的shell時期內部指令:cat /e ...


    在一些複雜的Linux維護工作中,大量重覆的輸入和交互操作不但費時費力,容易出錯.這時候就需要用到腳本。

  編寫腳本的好處:  批量的處理,自動化的完成維護,減輕管理員的負擔。

  linux的shell腳本是一種特殊的應用程式,常見的shell解釋器有很多種,使用不同的shell時期內部指令:cat /etc/shells 

[root@xiaolyu ~]# cat /etc/shells

/bin/bash是大多數linux中預設的shell解釋器。之後的所有腳本的編寫都是bash腳本。

 

一、編寫第一個Shell腳本

將平時的操作命令順序的放入到文件中賦予執行許可權,一次的執行。

我們來編寫第一個腳本first.sh

linux不以尾碼名區分文件,為了方便記憶這裡我就以.sh為結尾

[root@xiaolyu ~]# vim first.sh

 

註釋:

#!/bin/bash 主要是為了聲明,我所寫的均為bash語言(我是用的是bash解釋器)

第二行為註釋行,註釋信息不生效

當寫一個比較大的腳本時,如果沒有一個好的註釋,那麼也就也就沒有人都能夠看懂其中的意思了

再往後即執行的命令。

執行過程:

 

[root@xiaolyu ~]# ll first.sh                            #查看是否具有執行許可權
-rw-r--r--. 1 root root 62 Aug 30 22:58 first.sh   
[root@xiaolyu ~]# chmod +x first.sh              #給腳本添加執行許可權
[root@xiaolyu ~]# ll first.sh                           #查看腳本是否具有執行許可權
-rwxr-xr-x. 1 root root 62 Aug 30 22:58 first.sh
[root@xiaolyu ~]# ./first.sh                           #執行腳本

執行的結果:

 

E-執行腳本的不同方式

第一種使用絕對路徑執行

第二種使用相對路徑執行,如./的方式

第三種使用 sh命令來執行  格式  sh 腳本名   不需要執行許可權    -x參數

第四種使用 . (空格)腳本名稱的方式執行  不需要執行許可權  .  first.sh

第五種使用 source 腳本名稱        不需要執行許可權(主要用於生效配置文件)

#建議使用後三種,在生產環境中不要輕易的給文件可執行許可權;

二、 腳本中的變數。

變數的定義是:可以存放一個可變的值的空間

可以通過不同的環境進行改變就是一個可以變的值.

預設情況下: 在Linux中可以將每個shell看成不同的執行環境,所以相同的一個變數名稱在不同的變數執行環境中的變數值是不同的.

常見的shell變數分類:

自定義變數、環境變數、位置變數、預定義變數

變數的輸出

一般使用echo 輸出變數   echo $變數名

1.自定義變數

舉例1:來進行定義一個變數名字為Linux值為7.2 

[root@xiaolyu ~]# Linux=7.2      #為變數Linux賦值

[root@xiaolyu ~]# echo $Linux    #輸出變數Linux的值

7.2

[root@xiaolyu ~]# linux=6.5      #為變數linux賦值

[root@xiaolyu ~]# echo $linux      #輸出變數linux的值

6.5

可以直接在命令行定義一個變數並賦予值,通過echo進行輸出變數 $是引用變數的特殊字元(必須使用$符號)

註意:echo和調用的變數之間必須要有空格。

          大小寫的變數的值是不同的。

舉例2:當需要一起調用兩組變數時

[root@xiaolyu ~]# echo $Linux $linux

7.2 6.5

直接使用echo 後面跟$調用的變數 如果有多個則空格隔開

舉例3:當變數名和後面的字元容易混淆的時候應該使用{}將變數名括起來

[root@xiaolyu ~]# echo system${Linux}

system7.2

[root@xiaolyu ~]# echo ${Linux}system

7.2system

其他的特殊操作

雙引號( "  ")

當=號右邊賦值出現空格的時候,需要使用雙引號將其擴起

[root@xiaolyu ~]# webserver="nginx 1.1"
[root@xiaolyu ~]# echo $webserver
nginx 1.1

#在雙引號的範圍內還可以引用其他的變數,從而能夠將現有的變數賦值給新的變數

 

[root@xiaolyu ~]# Linux=7.2
[root@xiaolyu ~]# system="RHEL$Linux"
[root@xiaolyu ~]# echo $system
RHEL7.2
[root@xiaolyu ~]#

 

單引號( ' ')

   當要賦值的內容包括"$"、"\"等,具有其他含義的特殊字元時,應使用單引號將其括起來;

在單引號範圍內將無法引用其他的值,任何字元均作為普通字元看待,但賦值 的內容包含單引號時需要使用\’符號進行轉義以免衝突.

[root@xiaolyu ~]# kernel=3.10$Linux
[root@xiaolyu ~]# echo $kernel   
3.107.2                   #這個結果不是我們想要的,我們想要的結果是$3.10$Linux
[root@xiaolyu ~]# kernel='3.10$Linux'
[root@xiaolyu ~]# echo $kernel    
3.10$Linux
[root@xiaolyu ~]#

反撇號( ` `)

  位置在鍵盤esc的下邊的按鍵。

反撇號主要使用於命令替換,允許將某個命令的屏幕輸出結果賦值給變數。

舉例: 在命令行中查找程式的詳細的信息

[root@xiaolyu ~]# rpm -qf `which pwd`
coreutils-8.22-15.el7.x86_64
[root@xiaolyu ~]# rpm -qf $(which pwd)
coreutils-8.22-15.el7.x86_64
[root@xiaolyu ~]# which pwd
/usr/bin/pwd
[root@xiaolyu ~]# rpm -qf /usr/bin/pwd
coreutils-8.22-15.el7.x86_64
[root@xiaolyu ~]#

#反撇號括起來的範圍內必須是可執行的命令。否則將會出現錯誤

需要註意的是使用反撇號難以在一條命令中實現嵌套命令的操作,這是可以$()來替代反撇號

如果使用反撇號嵌套會出錯的!!

[root@xiaolyu ~]# rpm -q `rpm -qf `which pwd``

rpm: no arguments given for query

which-2.20-7.el7.x86_64

package pwd is not installed

建議使用$()的形式嵌套

[root@xuegod63 ~]# rpm -q $(rpm -qf $(which pwd))

coreutils-8.22-15.el7.x86_64

 

read命令

除了上面的賦值之外還可以使用read命令進行賦值,read命令用來提示用戶輸入信息,從而實現簡單的互動式過程(其實我們所輸入的命令就是一種互動式的過程)

執行時需要從標準輸入設備鍵盤讀取一行,並以空格為分隔符

[root@xiaolyu ~]# read kernel Linux    #同時定義兩個變數操作   
4.7.2 7.2       -->手動輸入的變數值
[root@xiaolyu ~]# echo $kernel
4.7.2
[root@xiaolyu ~]# echo $Linux
7.2

 

為了互動式更加的形象,提高易用性,加上 -p選項來設置提示信息

 

[root@xiaolyu ~]# read -p "input your password:" passwd    #-p 指定提示信息
input your password:123456              #123456就是$passwd的值
[root@xiaolyu ~]# echo $passwd        #輸出變數  
123456

---------------------------------------------------------------------------------------------------------------

以上的操作只是在當前的bash環境下生效,到了其他控制台或者是其他shell就不能生效了 

我們進入當前shell的子shell驗證:

 

[root@xiaolyu ~]# echo $Linux   #在當前的shell環境輸出變數
7.2
[root@xiaolyu ~]# bash            #切換子shell
[root@xiaolyu ~]# echo $Linux    #在子shell環境輸出變數

                                                        #沒有輸出東西。

[root@xiaolyu ~]#

也可以先定義一個全局變數並賦值:

[root@xiaolyu ~]# export website=www.baidu.com   #設置全局變數

[root@xiaolyu ~]# echo $website      #在當前環境輸出變數
www.baidu.com     
[root@xiaolyu ~]# bash                  #進入子shell      
[root@xiaolyu ~]# echo $website     #輸出子shell中的變數
www.baidu.com
[root@xiaolyu ~]#

 

需要註意的是變數的名是嚴格區分大小寫的

數值變數的運算:

shell腳本的數值運算多用於腳本程式的過程式控制制(如迴圈次數,使用量比較等)

在shell環境中,只能進行比較簡單的整數運算

運算符與變數之間必須有一個空各位,整數的運算主要是通過內部命令expr 命令進行運算。

 

格式  變數1 運算符 變數2

其中 變數1 、變數2 ……對應的需要計算的數值變數(需要$符號調用)常用的幾種運算符如下所示

加法運算:+

減法運算: -

乘法運算: \*

除法運算: /

求模(取餘)運算: % 

 

若要將運算結果賦值給其他變數可以這麼做

2. 環境變數

  環境變數是指系統本身運行需要由linux系統提前創建好的一類變數。

主要用於用戶的工作環境,包括(用戶的宿主目錄,命令的查找路徑,用戶的當前目錄,登錄的終端等)環境變數的值由操作系統本身自己維護,隨著用戶的狀態改變而改變

env調取當前環境變數


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

-Advertisement-
Play Games
更多相關文章
  • 由於工作需要,開始使用mysql資料庫,已經好久沒有使用了。基本已經忘了差不多。今天重新安裝配置了一下,寫個隨筆記錄一下,以免自己以後需要的時候翻看,如有不正確或需要補充的,希望大家多多留言。 首先下載mysql,我直接通過百度軟體中下載的“mysql-5.6.24-win32.1432006610 ...
  • 介紹 從archive單詞的解釋我們大概可以明白這個存儲引擎的用途,這個存儲引擎基本上用於數據歸檔;它的壓縮比非常的高,存儲空間大概是innodb的10-15分之一所以它用來存儲歷史數據非常的適合,由於它不支持索引同時也不能緩存索引和數據,所以它不適合作為併發訪問表的存儲引擎。Archivec存儲引 ...
  • MySql Server安裝步驟 1安裝MySql Server 2 安裝MySqlServer管理工具 解壓中文語言包,將文件複製到安裝目錄下覆蓋 文件覆蓋後,打開軟體設置語言為中文(CN) 3 MySqlServer開發註意事項(C#) public class Cmd { /// <summa ...
  • 總結了27條機器學習相關的Awesome系列,如有遺漏敬請指出。 ...
  • 在SQL Server資料庫或OACLE資料庫當中,通常一個會話持有某個資源的鎖,而另一個會話在請求這個資源,就會出現阻塞(blocking)。這是DBA經常會遇到的情況。當出現SQL語句的阻塞時,很多人想查看阻塞的源頭(哪個SQL語句阻塞了哪個SQL),這樣方便直觀、簡潔明瞭的定位問題。但是很多時... ...
  • 介紹 接下來幾篇文章會詳細介紹幾種常用的存儲引擎及適合場景。這篇文章就先來大概瞭解一下mysql的存儲引擎。 參考說明:mysql5.7 查看支持的存儲引擎 mysql> show engines \G; *************************** 1. row ************ ...
  • 利用HAProxy代理SQL Server的AlwaysOn輔助副本 公司最近資料庫升級到SQL Server2014 ,並部署了alwayson高可用集群 機房內有三套程式需要讀取資料庫 第一套:主程式,讀寫資料庫,連接主副本 第二套:報表程式,讀報表,連接輔助副本 第三套:歷史庫程式,讀歷史庫, ...
  • 1. sql語句查詢某位數字或者某幾位數字開頭的數據,欄位類型為數字類: 2. sql搜索以4開頭和含有李字的數據: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...