標籤: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變數的核心基礎