簡單跟大家介紹一下腳本編程中的變量。
大家都知道,腳本編程,主要由三個部分組成,一是命令,二是變量,三是控制語句。
變量的使用,可以讓腳本變得更加簡潔,高效。
我們主要簡單講一下變量的概念,變量的類型,變量的種類,不同種類的變量是如何定義的,變量的基本操作,以及變量的配置文件。
了解了這些,我們還可以聊一聊變量的高級操作。
首先,什么是變量?
通俗一點講:變量就是一段命名的內存空間。
我們給內存的一段空間,取一個名字,賦一個值,這個過程就是定義變量的過程。
如圖,通過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
主要介紹了shell編程中的變量定義,內容寫的很不錯,排版上圖片沒能顯示。在寫完博客之后,盡可能的注意一下,或者檢查一下