什麼是Shell變數 在初等數學數學方程式中,我們會經常碰到類似於這樣的方程式: y=x+1 ,等號左右兩邊的 x 和 y 稱之為未知數。在編程裡面它們他們則代表變數名與變數值。 通過該示例,我們可以得出一個結論:簡單來說, 變數是編程中最基本 ...
什麼是Shell變數
在初等數學數學方程式中,我們會經常碰到類似於這樣的方程式:y=x+1 ,等號左右兩邊的x和y稱之為未知數。在編程裡面它們他們則代表變數名與變數值。
通過該示例,我們可以得出一個結論:簡單來說,變數是編程中最基本的存儲單位,它會暫時存儲用戶放進去的數據,而存儲的數據位於記憶體空間中,通過正確調用記憶體空間中變數名字即可以取出與之對應的數據。在Shell中定義變數和取值如下所示:
變數註意事項
1、定義變數的方法,先定義變數名,緊跟賦值操作符=,最後是變數對應的值,中間不能存在空格,否則會出現報錯,這一點是跟其他語言比較大的區別,如下所示:
2、列印變數值,需要在變數名前加$或${},如下所示:
echo $y
echo ${y}
3、變數名只能為字母、數字或下劃線且只能以字母或下劃線開頭(這一點跟大多數語言一樣,至於為什麼請問度娘)
4、變數名需要遵循一定的規範,並且要一見名便知其意。
常見的命令規範有三種:
- 匈牙利命名法
該命令方法是在每個變數名前添加表示數據類型的字元 - 駝峰命名法
混合使用大小寫字母來對變數進行命名。而且是首字母小寫,後續單詞第一個字母大寫,如userName - 帕斯卡命名法
與駝峰法很很像,每個單詞第一個字母均大寫,如UserName
5、環境變數需要全部採用大寫形式書寫
6、在其他強類開語言中(如Java/C#)對數據類型都有其嚴格的定義,如整型int、字元char、字元串string、小數float/double/decimal等等。而在Shell中,預設是不區分變數類型的。如果需要顯式定義變數類型,則可以使用declare定義。
7、如果要在crond做定時任務時需要在Shell腳本中使用環境變數需要先在執行腳本中重新定義
變數類型
變數可分為兩類:環境變數(全局變數)和普通變數(局部變數),而環境變數又可以分為bash內置環境變數和用戶自定義環境變數。詳細可參考下圖所示:
環境變數(全局變數):可以在創建它們的Shell和其任意子Shell進程中使用
普通變數(局部變數):僅能在創建它們的Shell函數和腳本中使用
內置環境變數
環境變數一般是指使用export內置命令導出的變數,用於定義Shell的運行環境、保證Shell命令的正確執行。Shell通過環境變數來確定登錄用戶名、命令路徑、終端類型、登錄目錄等,所有的環境變數都是系統全局變數,可用於所有子進程中。
環境變數可以在命令行中設置和創建,但在用戶退出命令行時這些變數值就會丟失。如果希望永久保存環境變數,可以在用戶目錄下的.bashrc或.bash_profile文件中或全局變數配置/etc/profile文件中定義。在將環境變數放入上述文件後,每次用戶登錄時這些變數都將被初始化。
- 1、按照系統規範,所有環境變數的名字必須採用大寫形式
- 2、在將環境變數應用於用戶進程程式之前,都應該用export命令導出定義。如export JAVA_HOME
- 3、有部分環境變數,如HOME、PATH、SHELL、UID、USER等,的用戶登錄之前就已經被/bin/login程式設置好了。通常環境變數被定義並保存在用戶目錄下的.bash_profile或/etc/profile中。
- 4、在查看設置的變數時,有3個命令可顯示變數的值:set、env、declare
set:輸出所有的變數,包括全局變數和局部變數
env:只顯示全局變數
declare:輸出所有的變數、函數、整數和已經導出的變數
set -o:顯示bash Shell的所有參數配置信息
env查看系統環境變數:
declare查看所有變數、函數、整數等
set輸出所有變數
set -o輸出bash參數配置
自定義環境變數
設置環境變數
如果想要設置環境變數,就要在給變數賦值前之後或在設置變數時使用export命令,除export命令,使用declare -x命令也可以實現同樣的功能。示例如下:
export JAVA_HOME=/usr/local/java
或
JAVA_HOME=/usr/local/java;export JAVA_HOME
或
declare -x JAVA_HOME=/usr/local/java
以上為設置自定義環境變數的3種方法,而在此處不要在變數名前添加$
- 自定義環境變數示例
接下來我們來看看讓環境變數永久生效的常用設置文件
- 1、用戶的環境變數配置
對於用戶環境變數的設置,比較常見的是用戶目錄下的.bashrc和.bash_profile。推薦在~/.bash_profile中進行設置。
- 2、全局變數配置
常見的全局環境變數的配置文件有/etc/profile、/etc/bashrc、/etc/profile.d
若要登錄後初始化或顯示載入內容,則把腳本文件放在/etc/profile.d下即可,無須添加執行許可權。
示例一:設置登錄提示
以上任意一種方法均可,上面是兩種方法合併處理進行演示。實際操作只需要在一個文件中操作即可。
示例二:在Linux中設置Java環境變數
export JAVA_HOME=/usr/local/java/jdk1.7.0_09
export JRE_HOME=/usr/local/java/jdk1.7.0_09/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
顯示環境變數
- 通過echo和printf顯示環境變數
首先我們來顯示一些常見的變數
從上面可以看出顯示環境變數可以使用 echo 和 printf 。其中printf是一種比較複雜的格式化列印工具。如果感興趣可以查看相應的資料。
- 通過env、set和declare顯示預設的環境變數
可查看前面所講內容
取消環境變數
如果定義了環境變數,不想使用,是否可以消除環境變數定義了?在這裡我們可以使用 unset 命令。
[root@localhost ~]# echo $USER
root
[root@localhost ~]# unset USER # 清除變數,註意變數前面沒有 $
[root@localhost ~]# echo $USER
# 輸出為空白
普通變數
定義本地變數
本地變數僅在用戶當前Shell中有效,如果在Shell中啟動另一個進程或退出,則變數無法進行傳遞。
- 變數的定義及賦值如下所示:
var=value # 定義變數併進行賦值,此時沒有引號
var='value' # 定義變數併進行賦值,此時有單引號
var="value" # 定義變數併進行賦值,此時有雙引號
var=`value` # 定義變數併進行賦值,此時有反引號
以上變數賦值的區別如下所示:
- 無引號:一般常用於連續的字元串、數字、路徑等進行賦值。但如果變數中含有空格,則會導致賦值不完整,無法輸出完整的變數值
- 單引號:所見即所得,即輸出時會將單引號中的所有內容原樣輸出,不做任何轉義和解釋,因此稱之為強引用
- 雙引號:輸出引號中間的全部內容,如果引號中含有變數、特殊轉義字元、命令(需要使用反引號)等會先把變數、轉義字元、命令進行解析再輸出內容,因此稱之為弱引用
- 反引號:常用於引用命令,即反引號中的內容會被當作命令進行解析輸出,相當於$()
以上四種賦值方法,數值內容進行賦值可以不加引號,其他若沒有特殊要求的情況,建議進行賦值均採用雙引號
定義本地變數輸出
方法一 | 關係 | 方法二 |
---|---|---|
$a | 等效於 | ${a} |
`pwd` | 等效於 | $(pwd) |
以上兩種輸出變數值建議採取第二種方法,原因如下所示:
- 如以用戶名+rc文件夾,定義變數$usernamerc,如這樣寫會導致變數為usernamerc,如果寫為${username}rc,則可以很明顯的看出變數為username
- ``,反引號容易與單引號引起混淆
定義本地變數示例
[root@localhost Test]# a=718
[root@localhost Test]# b='718'
[root@localhost Test]# c="718"
[root@localhost Test]# d=`date +%F`
[root@localhost Test]# echo $a
718
[root@localhost Test]# echo $b
718
[root@localhost Test]# echo $c
718
[root@localhost Test]# echo ${c}
718
[root@localhost Test]# echo $d
2018-11-02
[root@localhost Test]# echo $(date +%F)
2018-11-02
[root@localhost Test]# a=823-$a
[root@localhost Test]# b='823-$a'
[root@localhost Test]# c="823-$a"
[root@localhost Test]# echo $a
823-718
[root@localhost Test]# echo $b
823-$a
[root@localhost Test]# echo $c
823-823-718
[root@localhost Test]# echo ${c}
823-823-718
[root@localhost Test]# path=`pwd`
[root@localhost Test]# echo $path
/root/Test
環境變數初始化及其對應文件的生效順序
在登錄Linux系統後,會預設啟動一個Shell,此時Shell會在各個配置文件中查找並使用對應的環境變數設置。而Shell所使用的環境變數取決於Shell的運行方式,通常分為以下三種:
- 通過系統用戶登錄後預設運行的Shell
- 非登錄互動式運行的Shell
- 執行腳本運行的非互動式Shell
當用戶是通過登錄Linux系統,此時Shell會作為登錄Shell啟動,此時載入環境變數的順序如下所示:
詳細解釋如下所示:
1、用戶登錄系統後會首先載入/etc/profile全局變數文件。
/etc/profile是Linux預設的Shell主環境變數文件,系統上每個用戶登錄都會載入該文件。
2、當載入完/etc/profile文件後,會執行載入/etc/profile.d目錄中的腳本文件。
/etc/profile.d目錄中有很多腳本文件,如果需要自定義登錄即運行腳本,可以將自己的腳本放置到該目錄中。
3、前面載入完成後,開始載入~/.bash_profile(用戶環境文件),而該文件又會分別載入~/.bashrc和/etc/bashrc文件。如果這些文件存在,則執行,如沒有,則不執行。
如果用戶的Shell不是登錄啟動時(如SSH遠程連接),此時這種非登錄Shell只會載入$HOME/.bashrc,不會去查找/etc/bashrc,如果需要載入這些配置,則需要將變數設定等寫入$HOME/.bashrc或者/etc/bashrc中。而不是$HOME/.bash_profile或者/etc/profile。
本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註: