《跟老男孩學Linux運維之shell編程實戰》-第二章 shell變量的核心基礎

這篇文章主要講解 shell變量的核心基礎。

1.變量是什麼?

變量是什麼?可能有好多人不明白,簡單地說,變量就是用一個固定的字符串(也可能是字符、數字等的組合)代替更多、更復雜的內容,該內容裏可能還會包含變量、路徑、字符串等其他的內容。

    變量的賦值方式爲:先寫變量名稱,緊接着是“=”這個字符,最後是值,中間無任何空格(變量的內容一般要加雙引號,以防止出錯,特別是當值裏的內容之間有空格時)。

    如何打印變量?通過echo命令加上$變量名 打印變量的值:

例如:定義變量和打印變量:

[root@www ~]# XiaoYu="My name is XiaoYu"  ==>定義變量,變量名爲XiaoYu,變量的內容爲:"My name is XiaoYu"

[root@www ~]# echo $XiaoYu                        ==>打印變量XiaoYu的值
My name is XiaoYu

2.變量的類型:

變量可分爲兩類:環境變量(全局變量)和普通變量(局部變量)

(1)   環境變量也可稱爲全局變量,可以在創建它們的shell及其派生出來的任意進程shell中使用,環境變量又可以分爲自定義環境變量和bash內置的環境變量。

  •  環境變量一般是指用export內置命令導出的變量,用於定義shell的運行環境,保證shell命令的正確執行。shell通過環境變量來確定登錄用戶名、命令路徑、終端類型、登錄目錄等,所有的環境變量都是系統全局變量,可以用於所有子進程中。

  • 環境變量可以在命令行中設置和創建,但用戶退出命令行時這些變量值就會丟失,如果希望變量永久生效,可在用戶家目錄下的.bash_profile或.bashrc或全局配置文件/etc/bashrc或/etc/profile文件中定義。

  • 按照系統規範,所有環境變量的名字均採用大寫形式。在將環境變量應用於用戶進程程序之前,都應該用export命令導出定義,例如:export XIAOYU=1。

  • 查詢系統中的環境變量:set(輸出所有的變量,包括全局變量和局部變量)、env(只顯示全局變量) 、declare(顯示所有的變量、函數、整數和已經導出的變量)。

(2)  普通變量也可稱爲局部變量,只能在創建它們的shell函數或shell腳本中使用。

3.自定義環境變量:

設置環境變量,就要在給變量賦值之後或者在設置變量時使用export命令,其實出了export命令,帶-x選項的declare內置命令也可以完成同樣的功能。export命令和declare命令的格式如下:

(1)export  變量名=value

(2)變量名=value;export 變量名

(3)declare -x 變量名=value

以下爲定義變量並賦值的方法:

[root@www ~]# export NAME=XiaoYu
[root@www ~]# declare -x NAME=XiaoYu
[root@www ~]# NAME=XiaoYu;export NAME

以下爲自定義全局環境變量的示例:

[root@www ~]# cat /etc/profile | grep XiaoYu
export NAME='XiaoYu'          ==>編輯文件/etc/profile,add此行,保存退出

[root@www ~]# source /etc/profile      ==>或 . /etc/profile 使/etc/profile生效

[root@www ~]# echo $NAME               ==>打印變量
XiaoYu

[root@www ~]# env | grep XiaoYu        ==>查看定義的結果
NAME=XiaoYu

4.環境變量永久生效的配置文件:

(1)用戶的環境變量配置:

[root@www ~]# ls /root/.bashrc    ==>推薦在此文件中優先配置
/root/.bashrc
[root@www ~]# ls /root/.bash_profile
/root/.bash_profile

提示:對於用戶的環境變量設置,比較常見的是用戶家目錄下的.bashrc.bash_profile

(2)全局環境的配置文件:

/etc/profile

/etc/bashrc

/etc/profile.d/

若要在登錄後初始化或顯示加載內容,則把腳本文件放在/etc/profile.d/目錄下即可(無需加執行權限)

5.設置登錄提示的兩種方法:

方法一:在/etc/motd裏增加提示的字符串:

[root@www ~]# cat /etc/motd
welcome to ......

方法二:在/etc/profile.d下面增加如下腳本:

[root@www ~]# cat /etc/profile.d/welcome.sh  ==>腳本內容根據實際情況書寫

6.顯示與取消環境變量:

(1)通過echo或printf命令打印變量:

[root@www ~]# echo $NAME
XiaoYu
[root@www ~]# printf "$NAME\n"  ==>printf是一個更復雜的格式化打印內容的工具,一般不需要
XiaoYu

(2)用env或set顯示默認的環境變量

(3)unset取消本地變量和環境變量:

[root@www ~]# echo $NAME
XiaoYu
[root@www ~]# unset NAME
[root@www ~]# echo $NAME
                                                     ==>返回結果爲空

環境變量知識小結:

  • 變量名通常要大寫。

  • 變量可以在自身的shell及子shell中使用。

  • 常用export來定義環境變量。

  • 執行env默認可以顯示所有的環境變量名稱及對應的值

  • 輸出時用“$變量名”,取消時用“unset  變量名”

  • 書寫crond定時任務時要注意,腳本要用到的環境變量最好先在所執行的shell腳本中重新定義。

  • 如果希望環境變量永久生效,則可以將其放在用戶環境變量文件或全局環境變量文件裏。

7.普通變量:

(1)定義本地變量:本地變量在用戶當前shell生存期的腳本中使用。

普通變量的定義:

變量名=value                ==>賦值時不加引號

變量名=‘value’         ==>賦值時加單引號

變量名=“value”         ==>賦值時加雙引號

變量的內容可以用單引號或雙引號引起來,也可以加引號,但是這三者的含義是不同的。

將連續的普通字符串的內容賦值給變量,不管用不用引號,或者不管用什麼引號,它的內容是什麼,打印變量時就會輸出什麼。

例:定義變量a、b、c,並打印出各個變量的值。

[root@www ~]# a=192.168.1.2
[root@www ~]# b='192.168.1.2'
[root@www ~]# c="192.168.1.2"
[root@www ~]# echo a=$a
a=192.168.1.2
[root@www ~]# echo b=$b
b=192.168.1.2
[root@www ~]# echo c=$c
c=192.168.1.2
[root@www ~]# echo c=${c}
c=192.168.1.2

提示:$變量名錶示輸出變量,可以用$c和${c}兩種用法

接着上述變量的得結果,繼續輸入如下內容:

[root@www ~]# a=192.168.1.2-$a
[root@www ~]# b='192.168.1.2-$a'

[root@www ~]# c="192.168.1.2-$a"
[root@www ~]# echo $a
192.168.1.2-192.168.1.2
[root@www ~]# echo $b
192.168.1.2-$a
[root@www ~]# echo $c
192.168.1.2-192.168.1.2-192.168.1.2

上述案例說明,當內容爲簡單連續的數字、字符串、路徑名時,定義變量在不加引號的情況下,值裏有變量的會被解析後再輸出;

定義變量時,如果使用了單引號,則變量的內容是什麼,就輸出什麼,即所見即所得。定義變量時使用了雙引號,輸出變量內容時引號裏的變量及命令會經過解析後再輸出內容。

提示:數字內容的變量定義可以不加引號,其他沒有特別要求的字符串等定義時最好都加上雙引號,如果需要原樣輸出就加單引號,定義變量加雙引號是最常見的使用場景。

(2)在shell中定義變量名及變量內容賦值的要求:   

    變量名一般由字母、數字、下劃線組成,可以以字母或下劃線開頭。

(3)把一個命令的結果作爲變量的內容賦值的方法:

方法一:變量名=` ls`

方法二:變量名=`$(ls)`

局部(普通)變量定義及賦值的經驗小結:

定義變量:

  • 若變量的內容爲連續的數字或字符串,賦值時,變量內容兩邊可以不加引號。

  • 變量的內容很多時,如果有空格且希望解析內容中的變量,就加雙引號。

  • 希望原樣輸出變量中的內容時就用單引號。

  • 希望變量的內容時命令的解析結果就用反撇號或者用$( )括起來。

輸出變量:

  •  使用“$變量名”即可輸出變量的內容,常用“echo $變量名”的方式,當然也可用printf代替echo輸出更復雜的格式內容。

  • 在變量名前加$可以取得該變量的值,$a和${a}的寫法不同,但是效果相同。

  • 用echo等命令輸出變量的時候,也可用單引號、雙引號、不加引號,如echo$a 、echo “$a”、echo ‘$a’,用法和前面變量內容定義的總結是一致的。

  • $dbname_tname,當變量後面連接有其他的字符串的時候,必須給變量加上大括號{ },例如:$dbname_tname就用改爲${dbname}_tname

8.在定義變量、賦值及變量輸出加單引號、雙引號、反撇號和不加引號的簡要說明。

   名稱
                                                                             解釋
單引號
所見即所得,即輸出時會將單引號內的所有內容都原樣輸出,或者描述爲單引號裏面看到的是什麼,就會輸出什麼。
雙引號
輸出雙引號內的所有內容,如果內容中有命令(要用反撇號引起來)、變量、特殊轉義符等,會先把變量、命令、轉義符解析出結果,然後再輸出最終內容,推薦使用。
無引號
賦值時,如果變量內容中有空格,則會造成賦值不完整。而輸出內容時,會將含有空格的字符串視爲一個整體輸出;如果內容中有命令(要用反撇號引起來)、變量等,則會先把變量、命令解析出結果,然後輸出最終內容;如果字符串中帶有空格等特殊字符,則有可能無法完整地輸出,因此需要改加雙引號。一般連續的字符串、數字、路徑等可以不加任何引號進行賦值和輸出,不過最好是用雙引號代替無引號的情況,特別是對變量賦值時。
反引號
` `一般用於引用命令,執行的時候命令會被執行,相當於$( ),賦值和輸出都要用` `將命令引起來。

提示:上述結論同樣適用於grep、awk。

這裏僅爲Linux shell下的結論,對於awk語言會有點特別。

AWK調用shell變量結論如下:

wKiom1j1tL7yQHkpAAAryuF4P3Q797.png

建議:

  • 在腳本中定義普通字符串變量時,應儘量把變量的內容用雙引號引起來。

  • 單純的數字的變量內容可以不加引號。

  • 希望變量的內容原樣輸出時需要加單引號。

  • 希望變量值引用命令並獲取命令的結果時就用反引號(反撇號)或$( )。

8.關於自定義普通字符串變量的建議:

  • 內容是純數字、簡單的連續字符(內容中不帶任何空格)時,定義時可以不加任何引號。

  • 沒有特殊情況時,字符串一律都用雙引號定義賦值,特別是多個字符串中間有空格時。

  • 當變量裏的內容需要原樣輸出時,要用單引號。


結論:

(1)變量名及變量內容定義小結:

   a)變量名只能爲字母、數字或下劃線,只能以字母或下劃線開頭。    

   b)變量名的定義要有一定的規範,並且要見名知意。

   c)一般的變量定義、賦值常用雙引號,簡單連續的字符串可以不加引號;希望原樣輸出的用單引號。

   d)希望變量的內容是命令的解析結果時,要用反引號(反撇號),或者用$( )把命令括起來再賦值。

(2)shell定義變量時使用“=”的知識

 比較變量是否相等時可以用“=”或“==”。

(3)打印輸出及使用變量的知識

    a)打印輸出或使用變量時,變量名前要接$符號;變量名後面緊接其他字符的時候,要用大括號將變量部分單獨括起來,在unset、export、(())等場景中使用但不打印變量時不加$。

    b)打印輸出或使用變量時,一般加雙引號或不加引號;如果是字符串變量,最好加雙引號,希望原樣輸出時使用單引號。




以上爲本人在讀《跟老男孩學Linux運維之shell編程實戰》這本書時的筆記,如有任何版權問題,請聯繫留言。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章