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

來源:互聯網
上載者:User

標籤:shell變數

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

1.變數是什嗎?

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

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

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

例如:定義變數和列印變數:

[[email protected] ~]# XiaoYu="My name is XiaoYu"  ==>定義變數,變數名為XiaoYu,變數的內容為:"My name is XiaoYu"

[[email protected] ~]# 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

以下為定義變數並賦值的方法:

[[email protected] ~]# export NAME=XiaoYu
[[email protected] ~]# declare -x NAME=XiaoYu
[[email protected] ~]# NAME=XiaoYu;export NAME

以下為自訂全域環境變數的樣本:

[[email protected] ~]# cat /etc/profile | grep XiaoYu
export NAME=‘XiaoYu‘          ==>編輯檔案/etc/profile,add此行,儲存退出

[[email protected] ~]# source /etc/profile      ==>或 . /etc/profile 使/etc/profile生效

[[email protected] ~]# echo $NAME               ==>列印變數
XiaoYu

[[email protected] ~]# env | grep XiaoYu        ==>查看定義的結果
NAME=XiaoYu

4.環境變數永久生效的設定檔:

(1)使用者的環境變數配置:

[[email protected] ~]# ls /root/.bashrc    ==>推薦在此檔案中優先配置
/root/.bashrc
[[email protected] ~]# ls /root/.bash_profile
/root/.bash_profile

提示:對於使用者的環境變數設定,比較常見的是使用者家目錄下的.bashrc和.bash_profile。

(2)全域環境的設定檔:

/etc/profile

/etc/bashrc

/etc/profile.d/

若要在登入後初始化或顯示載入內容,則把指令檔放在/etc/profile.d/目錄下即可(無需加執行許可權)

5.設定登入提示的兩種方法:

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

[[email protected] ~]# cat /etc/motd
welcome to ......

方法二:在/etc/profile.d下面增加如下指令碼:

[[email protected] ~]# cat /etc/profile.d/welcome.sh  ==>指令碼內容根據實際情況書寫

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

(1)通過echo或printf命令列印變數:

[[email protected] ~]# echo $NAME
XiaoYu
[[email protected] ~]# printf "$NAME\n"  ==>printf是一個更複雜的格式化列印內容的工具,一般不需要
XiaoYu

(2)用env或set顯示預設的環境變數

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

[[email protected] ~]# echo $NAME
XiaoYu
[[email protected] ~]# unset NAME
[[email protected] ~]# echo $NAME
                                                     ==>返回結果為空白

環境變數知識小結:

  • 變數名通常要大寫。

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

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

  • 執行env預設可以顯示所有的環境變數名稱及對應的值

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

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

  • 如果希望環境變數永久生效,則可以將其放在使用者環境變數檔案或全域環境變數檔案裡。

7.普通變數:

(1)定義本地變數:本地變數在使用者當前shell生存期的指令碼中使用。

普通變數的定義:

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

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

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

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

將連續的一般字元串的內容賦值給變數,不管用不用引號,或者不管用什麼引號,它的內容是什麼,列印變數時就會輸出什麼。

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

[[email protected] ~]# a=192.168.1.2
[[email protected] ~]# b=‘192.168.1.2‘
[[email protected] ~]# c="192.168.1.2"
[[email protected] ~]# echo a=$a
a=192.168.1.2
[[email protected] ~]# echo b=$b
b=192.168.1.2
[[email protected] ~]# echo c=$c
c=192.168.1.2
[[email protected] ~]# echo c=${c}
c=192.168.1.2

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

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

[[email protected] ~]# a=192.168.1.2-$a
[[email protected] ~]# b=‘192.168.1.2-$a‘

[[email protected] ~]# c="192.168.1.2-$a"
[[email protected] ~]# echo $a
192.168.1.2-192.168.1.2
[[email protected] ~]# echo $b
192.168.1.2-$a
[[email protected] ~]# echo $c
192.168.1.2-192.168.1.2-192.168.1.2

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

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

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

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

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

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

方法一:變數名=` ls`

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

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

定義變數:

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

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

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

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

輸出變數:

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

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

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

  • $dbname_tname,當變數後面串連有其他的字串的時候,必須給變數加上大括弧{ },例如:$dbname_tname就用改為${dbname}_tname。

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

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

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

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

AWK調用shell變數結論如下:

650) this.width=650;" width="600" height="109" title="awk.png" style="width:400px;height:74px;" alt="wKiom1j1tL7yQHkpAAAryuF4P3Q797.png" src="https://s5.51cto.com/wyfs02/M00/91/61/wKiom1j1tL7yQHkpAAAryuF4P3Q797.png" border="0" vspace="0" hspace="0" />

建議:

  • 在指令碼中定義一般字元串變數時,應盡量把變數的內容用雙引號引起來。

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

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

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

8.關於自訂一般字元串變數的建議:

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

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

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


結論:

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

   a)變數名只能為字母、數字或底線,只能以字母或底線開頭。    

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

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

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

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

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

(3)列印輸出及使用變數的知識

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

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


以上為本人在讀《跟老男孩學Linux營運之shell編程實戰》這本書時的筆記,如有任何著作權問題,請聯絡[email protected]。




本文出自 “shayatou_1990” 部落格,請務必保留此出處http://shayatou1990.blog.51cto.com/12806916/1917018

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.