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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...