『忘了再學』Shell基礎 — 12、使用者自定義變數

繁華似錦Fighting 發表於 2022-05-17

1、變數定義

  • 變數正確定義。
    格式:變數名="變數值"
    # 兩種方式都可以
    [[email protected] ~]# name=zhenniubi
    
    [[email protected] ~]# name="zhen niubi"
    
  • 變數名不能用數字開頭。
    [[email protected] ~]# 2name="zhen niubi"
    -bash:2name=zhen niubi:command not found
    
  • 等號左右兩側不能有空格。
    [[email protected] ~]# name = "zhenniubi"
    -bash:name:command not found
    
  • 變數的值如果有空格,必須用引號包含。
    [[email protected] ~]# name=zhen niubi
    -bash:niubi:command not found
    

2、變數呼叫

呼叫變數用$符號。

#定義變數name
[[email protected] ~ ] # name="zhen niubi"

#輸出變數name的值
[[email protected] ~ ] # echo $name
zhen niubi

3、變數的修改

Shell中變數值的修改,是以覆蓋的形式完成的,以後最後一次對該變數的賦值為準。

#之前定義好的變數
[[email protected] ~]# name=ailin
[[email protected] ~]# 
[[email protected] ~]# echo $name
ailin

#修改後的變數值
[[email protected] ~]# name=cangls
[[email protected] ~]# 
[[email protected] ~]# echo $name
cangls

4、檢視變數

命令格式:

[[email protected] ~]# set [選項]

選項:

  • -u:如果設定此選項,呼叫未宣告變數時會報錯(預設無任何提示)(很常用)。
  • -x:如果設定此選項,在命令執行之前,會把命令先輸出一次。(不建議使用)

(1)-u選項說明:

在當前系統下從沒有定義過age欄位(變數),直接輸出age變數的值,如下圖可以看到沒有任何值。

image

如果我給age欄位定義一個空值,在檢視age欄位,如下圖,可以看到依舊沒有任何輸出。

image

那麼綜上所述,檢視一個變數時沒有任何輸出,是有兩種可能的。一種是age變數不存在,一種是age變數的值為空。在Java中,變數沒有被定義和變數值為空完全是兩個不同的概念,在Shell中也一樣,我們一定要對此進行區分。

如果我執行了set -u命令,就可以對上面兩種情況進行區分。

#直接執行`set -u`命令
[[email protected] ~ ] # set -u

#輸出一個未定義變數,顯示addr變數不存在。
[[email protected] ~]# echo $addr
-bash: addr: unbound variable

#給addr變數定義一個空值,
#在檢視變數,可以看到變數的值為空。
[[email protected] ~]# addr=""
[[email protected] ~]# echo $addr

[[email protected] ~]# 

注意:在命令列中執行set -u命令,這種方式是臨時生效的,需要永久生效,就需要寫入環境變數配置檔案中。(如何配置,看以後的環境變數配置內容)

總結:當設定了-u選項後,如果呼叫沒有設定的變數會有報錯。預設是沒有在何輸出的。

(2)-x選項說明:

就字面意思,如果設定了-x選項,會在每個命令執行之前,先把命令輸出一次

[[email protected] ~ ] # set -x
[[email protected] ~ ] # 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、變數刪除

[[email protected] ~]# unset 變數名

不需要在變數名前加$符號,只有在呼叫變數值的時候需要在變數名前加$符號。