腳本編程之變量

簡單跟大家介紹一下腳本編程中的變量。

大家都知道,腳本編程,主要由三個部分組成,一是命令,二是變量,三是控制語句。

變量的使用,可以讓腳本變得更加簡潔,高效。

我們主要簡單講一下變量的概念,變量的類型,變量的種類,不同種類的變量是如何定義的,變量的基本操作,以及變量的配置文件。

了解了這些,我們還可以聊一聊變量的高級操作。

首先,什么是變量?

通俗一點講:變量就是一段命名的內存空間。

我們給內存的一段空間,取一個名字,賦一個值,這個過程就是定義變量的過程。

腳本編程之變量

如圖,通過echo變量的名稱,就可以將變量的值顯示出來。

定義一個普通的變量非常簡單。

了解了變量的基本概念,我們可以說一說變量的種類。

變量主要有以下幾種:

1:環境變量

2:本地變量

3:局部變量

4:腳本參數變量

5:特殊變量

環境變量:對整個系統環境生效,像對當前shell,或是再在當前shell執行bash命令,進入一個子shell。環境變量都是生效的。

如圖。

腳本編程之變量

環境變量要通過export這個命令來定義。當然,還有其他命令,像declare -x 也能定義一個環境變量。

最常見的環境變量有PATH ,PWD ,BASH,RANDOM,想必大家都很熟悉了。

本地變量:僅對當前用戶的當前shell有效。

腳本編程之變量

如圖,我們可以看到當我們開了一下子shell,進入子shell的環境時,父shell定義的變量已經無效了 。

局部變量:僅對某個代碼片斷有效。定義方式:local name=value

腳本參數變量:跟在腳本后邊的參數,腳本會自動保存在自己內建的變量中,以$1,$2,$3這樣的順序命名。如圖

腳本編程之變量

space2.sh是一個簡單的算空白行的腳本,當在它的后邊給出參數/etc/profile時,就會自動將這個參數保存到腳本內建的變量$1中,并在腳本中進行引用。

特殊變量:這是sehll內部定義的變量,常見的有$$ $?  $#  $* $0

如圖

腳本編程之變量

第一個$$是查看當前shell的進程號的,第二個$?是一個非常常用的特殊變量,它的值是上一個命令的執行狀態結果,根據這個結果我們可以判斷上一條命令是否執行成功。常常用在腳本中,而$#則是表示腳本運行時的后邊跟的參數個數。$*表示腳本運行時后邊跟的參數的隊列,特殊變量$0則表示腳本或程序本身的路徑。

變量的定義:

環境變量定義方法:declare -x name=value ;  export name=value

本地變量定義方式:name=value

局部變量定義方式:local name=value

腳本參數變量:腳本自動定義

特殊變量:shell 內建

其實還有一些其他的定義方式:如定義變量只可讀readonly name=value declare -r name=value ;定義數值變量可以用declare -i 定義。

腳本編程之變量

如圖,定義只讀變量,當我們想要修改時,會被拒絕,這就是只讀變量的特殊之處。

腳本編程之變量

定義數值變量,即明確說明這個變量是按數值的形式存儲,數值是可以直接進行加減運算的。若是不明確定義是數值變量的話,如圖num2中,它就是按照字符的形式存儲,當然算不出結果啦。

變量定義好了,我們可以了解一些常用的操作。

最常用也是最簡單的方式就是對已經賦值的變量,直接引用了,即$name。其他的還有命令引用,語法格式有兩種,一種是name=${command}.另一種是name=`command`。這兩種方式都會直接引用命令的執行引果作為變量的值。

如圖:

腳本編程之變量

變量time的值并不是我們手動給予的,而是通過命令傳遞的,它的值是反引號中date +%F的執行結果。

有時我們需要對變量進行查看,就需要用到一些命令。

最常用的就是echo了。格式為: echo ${name}。

其次,我們還可以通過env ,envprint ,declare -x ,export ,set 對變量進行查看。

有定義,就有撤銷,撤銷變量很簡單,直接unset name即可。

還有一個我們常用的變量的操作就是對變量進行算術運算。變量想要實現算術運算,就要按照一定的表達式書寫,常用的表達式如下:

let var=#+#   let var++

var=$[#+#]  var=[var+#]

var=$((#+#))  var=((var+#))

當前,上面舉的運算符都是+。其實其他的運算符書寫也是一樣的。不過,需要注意的是,*運算符在某些特定的場合需要轉義。上表中,其實后邊的let var++這類運算也稱為變量的自增運算。只要表達式寫正確,結果都沒問題。

其實變量的算術運算,用得并不多,即使用,也是簡單的加減運算,如在腳本的while循環中,每循環一次做一次自增運算以不斷修正滿足條件等,簡單至極,故不作詳細說明。

既然變量是命名的內存空間,值是存儲在內存中的,那么一關機,變量的值肯定就不會存在了。有什么辦法可以解決這個問題?

聰明的你當然能猜到,肯定是將變量寫到配置文件中。在系統啟動時,讀入配置文件,那么之前定義的變量,就又生效啦。

那我們來了解一下這些配置文件都有哪些,他們都是做什么用的。

第一個是/etc/profile文件。這個文件在linux中是非常重要的,如果不夠了解它的作用,建議不要隨便對它進行修改,以免發生不必要的麻煩。大多數時候,我們唯一對它的修改,就是在里面添加一個程序的PATH環境變量。

profile是一個系統級別的配置文件,它為每一個用戶設置環境信息,是每一個用戶登陸時,首先載入的文件,并且也只載入一次。它定義了掩碼(umask),執行的調用命令,定義PATH環境變量,登陸時給的提示信息,顯示系統版本,命令提示符,等。

第二個是/etc/profile.d目錄下的所有文件。它主要定義了系統中應用程序的環境變量。

第三個是~/.bash_profile 前兩個/etc/profile ,/etc/profile.d目錄,定義的環境變量對所有用戶都生效。若是用戶想定義僅對自己生效的環境變量,可以寫入此配置文件中。這個文件其實就相當于環境變量的個人版。并且,也只在開機的時候執行一次。

第四個是/etc/bashrc 主要用于定義命令與別名,本地變量,也是對所有用戶生效,并且在每次執行一個腳本時,這個文件都會被讀取一次。

第五個就是~/.bashrc,這個是/etc/bashrc的個人版,功能差不多,只是生效的范圍是僅對當前用戶生效而已。

了解這些配置文件,分別定義了什么,我們大體可以對它們進行分類。

全局配置:

/etc/profile

/etc/profile.d

/etc/bashrc

個人配置:

~/.bash_profile

~/.bashrc  rc 其實就是run command的縮寫)

了解變量的分類,知道它們是做什么用的。其實我們也很有必要對他們的讀取順序進行了解。這樣有利于我們對Linux系統的進一下理解。

要了解讀取順序,我們有必要先了解一些登陸時的一些概念。

聰明的你應該注意到,對linux系統的操作,是為分交互式與非交換式的。簡單歸類一下,

交互式,就是通過su – 這種方式切換過去,或是我們通過輸入賬號密碼登陸進來的。非交互式,主要有腳本運行時打開的另一個子shell ,我們圖形界面中打開的另一個終端。

交互式,與非交互式他們對變量的配置文件的讀取順序是不同的。

正因如此,交互式與非交互式,它們的環境變量是不一樣的。

交互式讀取的順序:/etc/profile –> /etc/profild.d –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc

非交互式讀取順序:~/.bashrc –> /etc/bashrc –> /etc/profild.d

 

了解了上邊這些,我們對變量可以說有一人比較全面的認識了。有興趣的朋友,我們還可以一起探討一下變量的一些常用的高級操作。

如變量的切片,變量字符串的長度計算,字符的刪除,字符的替換,以及變量若為空時的默認賦值。

首先說一說變量的切片,咱們直接看實例吧。

腳本編程之變量

大家可以猜出,變量的切片是從0開始數起的,到結束的那位卻并不包括結束的那個字符。變量的切片有什么用呢,肯定就是當變量很長的時候,自己想要哪部分就切哪部分啦。

接下來說說變量字符長度的計算。非常簡單,看圖。

腳本編程之變量

個人目前沒發現長度計算有什么大用,都是直接用數的。

字符的刪除,有兩種,從前面刪,從后面刪。

先說從前面刪,它是根據匹配的pattern來刪除的。操作符是#。一個#表示刪除一個匹配到的pattern。##表示全部匹配到的。

腳本編程之變量

說完從前面刪除,再說說從后面如何刪除。如圖。

腳本編程之變量

需要注意的是,從前面刪除與從后面刪除,他們匹配的pattern是不一樣的。

從前面刪除時,是*. 而從后面刪除時,pattern也要從后面匹配。

變量的值中字符的替換:這和sed編輯器中的替換非常接近??磮D:

腳本編程之變量

只要找到其中相符的pattern,后邊再加上要換成的patter,就可以完成替換。當然,得出來的結果我們可以賦值給一個變量。例如寫成這樣linux2=${linux/centos7/redhat}。

看完上邊,接著我們再聊一聊變量高級操作中,我們最常用到的。

試想當我們在腳本中,得到一個變量時,我們常常想若這變量有值,則直接引用,若是沒有值,我們能不能給這個變量一個默認的值呢?這樣一來我們就可以省去一些寫條件判斷的麻煩。若雖沒給變量值為空,我們直接給變量定義一個默認值,然后放到腳本中運行并進行輸出相應結果。

如何給呢?其實也非常簡單。

腳本編程之變量

這種寫法,表示若是變量有值,則會顯示出變量原來的值并且不對變量進行重新賦值,若是變量沒值,即為空時,則給一個我們自己定義的默認值,并將其顯示出來。

這即是全文,從變量的基礎概念,到變量的類型,種類,不同種類的變量如何賦值,變量定義好了,我們可以對變量進行哪些操作,以及變量的配置文件的劃分,如何將合適的變量放到合適的配置文件上產生我們期待的結果。最后又簡單聊了聊變量的常用高級操作。

希望對大家有幫助。

原創文章,作者:old_radish,如若轉載,請注明出處:http://www.www58058.com/73600

(0)
old_radishold_radish
上一篇 2017-04-17 20:28
下一篇 2017-04-17 21:46

相關推薦

  • grep、egrep、vim練習

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及內部文件的屬組和其它用戶均沒有任何訪問權限。         [root@localhost ~]# install -d -m 600&nb…

    Linux干貨 2016-11-18
  • 第十周

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 1.POST 開機加電自檢,對計算機的cpu,硬盤,內存等進行檢測。 2.BIOS 對引導程序進行探測,并把控制權交給引導程序。 3.MBR Master bootloader record主引導程序.通常位于硬盤第一扇區/dev/hda(0,0)或/dev/sda(0,0). 此階…

    Linux干貨 2017-03-30
  • 馬哥教育網絡班21期-第2周課程練習

    1、 Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 cp 復制、mv 剪切、rm 刪除 tree,mkdir 2、 bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容及其示例演示。 echo$ 查看命令執行狀態返回值 。 返回0,則表示執行成功。 返回非零,則表示執行失敗。(1-255) 3、請使用命令行展開功能來完成…

    Linux干貨 2016-07-17
  • 淺談TCP三次握手和四次分手

          TCP(Transmission Control Protocol傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議提供可靠的連接服務,采用三次握手確認建立一個連接,比如我們去訪問一個網站,從輸入網址到頁面顯示我們所想要瀏覽的內容,這個過程其中就包含了小編要說的三次握手和四次揮手。 一、首先我們來了解…

    2017-09-02
  • 【linux】正則表達式之grep、egrep、元字符

    正則表達式:     又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。是一類字符所書寫的模式,其中許多字符(元字符)不表示其字面意義,而是表達控制或通配等功能。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符…

    Linux干貨 2015-04-01
  • Linux基于PXE實現系統全自動無人值守安裝

    前言 在生產環境中,我們時常會需要在多臺客戶端主機或服務器安裝操作系統,如果每一臺都去手動安裝,費時費力,顯然是不現實的。那么,如何高效的完成此類工作呢?文將講解如何實現Linux系統的全自動無人值守安裝。 提供PXE服務所需安裝包 dhcp:動態主機配置協議,給客戶端提供ip地址 tftp-server:tftp服務器端,提供系統安裝所需文件 xinetd…

    Linux干貨 2015-04-01

評論列表(1條)

  • renjin
    renjin 2017-04-21 10:24

    主要介紹了shell編程中的變量定義,內容寫的很不錯,排版上圖片沒能顯示。在寫完博客之后,盡可能的注意一下,或者檢查一下

欧美性久久久久