1、變數定義
- 變數正確定義。
格式:變數名="變數值"
# 兩種方式都可以 [root@localhost ~]# name=zhenniubi [root@localhost ~]# name="zhen niubi"
- 變數名不能用數字開頭。
[root@localhost ~]# 2name="zhen niubi" -bash:2name=zhen niubi:command not found
- 等號左右兩側不能有空格。
[root@localhost ~]# name = "zhenniubi" -bash:name:command not found
- 變數的值如果有空格,必須用引號包含。
[root@localhost ~]# name=zhen niubi -bash:niubi:command not found
2、變數呼叫
呼叫變數用$
符號。
#定義變數name
[root@localhost ~ ] # name="zhen niubi"
#輸出變數name的值
[root@localhost ~ ] # echo $name
zhen niubi
3、變數的修改
Shell中變數值的修改,是以覆蓋的形式完成的,以後最後一次對該變數的賦值為準。
#之前定義好的變數
[root@localhost ~]# name=ailin
[root@localhost ~]#
[root@localhost ~]# echo $name
ailin
#修改後的變數值
[root@localhost ~]# name=cangls
[root@localhost ~]#
[root@localhost ~]# echo $name
cangls
4、檢視變數
命令格式:
[root@localhost ~]# set [選項]
選項:
-u
:如果設定此選項,呼叫未宣告變數時會報錯(預設無任何提示)(很常用)。-x
:如果設定此選項,在命令執行之前,會把命令先輸出一次。(不建議使用)
(1)-u
選項說明
在當前系統下從沒有定義過age
欄位(變數),直接輸出age
變數的值,如下圖可以看到沒有任何值。
如果我給age
欄位定義一個空值,在檢視age
欄位,如下圖,可以看到依舊沒有任何輸出。
那麼綜上所述,檢視一個變數時沒有任何輸出,是有兩種可能的。一種是age
變數不存在,一種是age
變數的值為空。在Java中,變數沒有被定義和變數值為空完全是兩個不同的概念,在Shell中也一樣,我們一定要對此進行區分。
如果我執行了set -u
命令,就可以對上面兩種情況進行區分。
#直接執行`set -u`命令
[root@localhost ~ ] # set -u
#輸出一個未定義變數,顯示addr變數不存在。
[root@localhost ~]# echo $addr
-bash: addr: unbound variable
#給addr變數定義一個空值,
#在檢視變數,可以看到變數的值為空。
[root@localhost ~]# addr=""
[root@localhost ~]# echo $addr
[root@localhost ~]#
注意:在命令列中執行
set -u
命令,這種方式是臨時生效的,需要永久生效,就需要寫入環境變數配置檔案中。(如何配置,看以後的環境變數配置內容)
總結:當設定了
-u
選項後,如果呼叫沒有設定的變數會有報錯。預設是沒有在何輸出的。
(2)-x
選項說明
就字面意思,如果設定了-x
選項,會在每個命令執行之前,先把命令輸出一次
[root@localhost ~ ] # set -x
[root@localhost ~ ] # ls
+ ls --color=auto
anaconda-ks.cfg install.log install.log.syslog sh tdir test testfile
如果不新登陸系統,會一直這樣,因為上面說了,在命令列中直接執行是臨時生效的。並不推薦執行此選項,命令結果看起來很亂。
(3)set
命令說明
直接使用set
命令,不加任何選項,會查詢系統中所有的變數,包含使用者自定義變數和環境變數。(其實是一部分)
系統的另一部分變數,用env
命令來檢視。兩個命令看到的變數會有重疊,但是env
命令檢視不到自定義變數的。(查了一下,網上介紹的也很模糊,就是兩個命令就能夠查到系統中全部的變數,set
多用於檢視系統的使用者自定義變數,env
多用於查詢系統的環境變數。)
總結:
set
:用來顯示當前Shell的變數,包括當前使用者的變數。
每個Shell有自己特有的變數,這個和使用者變數是不同的,當前使用者變數和你用什麼Shell無關,不管你用什麼Shell,每個Shell都有自定義的Shell,也就是自己Shell的變數。這種變數不同Shell是不同的,這些變數只有set
才會顯示,是bash
特有的。這種變數也只對本Shell有效, 不能傳遞給子Shell。(就相當於Java中的區域性變數)。env
:用來顯示環境變數,也叫顯示當前使用者的變數,環境變數可傳遞給子Shell。(就相當於Java中的全域性變數)
5、變數刪除
[root@localhost ~]# unset 變數名
不需要在變數名前加
$
符號,只有在呼叫變數值的時候需要在變數名前加$
符號。