『忘了再學』Shell基礎 — 19、使用declare命令聲明變數類型

1、declare命令介紹

Shell中所有變數的默認類型是字元串類型,如果你需要進行特殊數據類型進行運算,使用declare命令就可以實現聲明變數的類型。

declare命令是一個內置命令,命令如下:

[root@localhost ~]# declare [+/-] [選項] 變數名

選項:
    -:  給變數設定類型屬性。
    +:  取消變數的類型屬性。
    -а: 將變數聲明為數組型。
    -i: 將變數聲明為整數型(integer)。
    -r: 將變數聲明為只讀變數。
         注意,一旦設置為只讀變數,既不能修改變數的值,也不能刪除變數,
         甚至不能通過+r取消只讀屬性。
    -x: 將變數聲明為環境變數。
    -p: 顯示指定變數的被聲明的類型。

注意:

Shell中就識別上邊這些數據類型,像日期類型,布爾類型等,Shell中默認是不支援的。

其實這樣做的目的都是為了降低Shell的難度。

示例:

# 定義兩個變數,進行求和
[root@Lyl tmp]# a=1
[root@Lyl tmp]# b=2
[root@Lyl tmp]# c=$a+$b
[root@Lyl tmp]# echo $c
1+2

# 可以看上在Shell中,變數值的默認類型是字元串。
# 如果我們要把1和2變成數字類型,就需要適用declare命令。


# 給變數aa和bb賦值
[root@Lyl tmp]# aa=11
[root@Lyl tmp]# bb=22

# 聲明變數cc的類型是整數型,它的值是aa和bb的和。
# 這裡注意一下,其實應該把變數aa和bb也通過declare命令聲明成數值型,
# 但是Shell這點還好,只把最後的和cc聲明成數值型,也是能進行計算的。
[root@Lyl tmp]# declare -i cc=$aa+$bb

# 輸出變數cc
[root@Lyl tmp]# echo $cc
33

Shell在數值運算這裡確實是比較麻煩,習慣就好了。

2、聲明數組變數類型

數組就是相同數據類型的元素按一定順序排列的集合,就是把有限個類型相同的變數用一個名字命名,然後用編號區分他們的變數的集合,這個名字稱為數組名,編號稱為下標。組成數組的各個變數稱為數組的元素,有時也稱為下標變數。

用白話說,變數和數組都是用來保存數據的,只是變數只能賦予一個數據值,一旦重複賦值,後邊的值就會覆蓋前邊值。而數組是可以賦予一組相同類型的數據值。

大家可以把變數想像成一個小辦公室,這個辦公室只能容納一個人辦公,辦公室名就是變數名。而數組是一個大辦公室,可以容納很多人同時辦公,在這個大辦公室的每個人是通過不同的座位號來區分的,這個座位號就是數組的下標,而大辦公室的名字就是數組名。

數組的下標是從0開始的,在調用數組值時,需要使用${數組[下標]}的方式來讀取。

數組基本用法示例:

# 我們先來定義一個變數test。
[root@Lyl ~]# test=123
[root@Lyl ~]# echo $test
123
# 修改test變數的值,則直接覆蓋原有值。
[root@Lyl ~]# test=456
[root@Lyl ~]# echo $test
456


# 數組
# 定義一個數組,添加西遊記四個主人公,並查看
[root@Lyl ~]# declare -a name[0]="tangc"
[root@Lyl ~]# declare -a name[1]="sunwk"
# 注意:在定義數組的時候,不用寫declare -a 系統也能識別你定義的是一個數組,
# 因為定義數組的格式比較特殊,不用強制聲明。
[root@Lyl ~]# name[2]="zhubj"
[root@Lyl ~]# name[3]="shahs"


# 查看數組內容
# 如果我們使用查看變數的方式查看數組,
# 則會只顯示數組用的第一個元素,也就是0號標元素。
[root@Lyl ~]# echo $name
tangc

# 查看數組元素的標準方式。
[root@Lyl ~]# echo ${name[2]}
zhubj

# 查看數組中所有的元素
[root@Lyl ~]# echo ${name[*]}
tangc sunwk zhubj shahs


提示:

Shell中的數組和Java中的數組,用法上差不多,但是Shell的數組是沒有定義數組相關函數的。

可能開發Shell的人認為,Shell不可能用於開發演算法類的東西,Shell本意是用來幫助Linux管理員高效的完成工作,降低管理難度的。(如果需要寫一些演算法,還是用那些高級語言去寫。)

因此數組在Shell中的作用就大幅度下降了。

3、聲明變數為環境變數

可以使用declare -x命令把變數聲明為環境變數,和export命令的作用是一樣的。

我們通過declare -p命令,顯示所有被declare聲明的變數,就可以看到裡邊有很多被declare -x命令聲明的變數,也就是環境變數。

準確的說export命令是declare -x命令的一種簡易寫法。也就是說,執行export命令定義一個環境變數,最終也是執行的declare -x命令。

示例:

# 直接輸入`declare -p`命令是查看所有的declare聲明的變數。
# 查看指定declare聲明的變數,
# 就以上邊定義的test變數為例。
[root@Lyl ~]# declare -p test
declare -- test="456"

# 通過`export`命令把test變數聲明成環境變數。
[root@Lyl ~]# export test
[root@Lyl ~]# declare -p test
declare -x test="456"


# 通過`declare +x`命令把test變數聲明成普通變數。
[root@Lyl ~]# declare +x test
[root@Lyl ~]# declare -p test
declare -- test="456"

# 通過`declare -x`命令把test變數聲明成環境變數。
[root@Lyl ~]# declare -x test
[root@Lyl ~]# declare -p test
declare -x test="456"


# 所以`export 變數名` 和 `declare -x 變數名`作用相同。
# export更好記憶。

4、聲明只讀屬性

一旦給變數設定了只讀屬性,那麼這個變數既不能修改變數的值,也不能刪除變數,甚至不能使用"+r"選項取消只讀屬性。

換種說法,其實就是把Shell中的一個變數,變成了常量。

命令如下:

# 定義一個普通變數test,並通過declare命令查看。
[root@Lyl ~]# declare -p test
declare -- test="456"

# 將test變數賦予只讀屬性。
[root@Lyl ~]# declare -r test
[root@Lyl ~]# declare -p test
declare -r test="456"

# 修改test變數的值,發現不能被修改。
[root@Lyl ~]# test=666
-bash: test: readonly variable

# test變數也不能取消只讀屬性。
[root@Lyl ~]# declare +r test
-bash: declare: test: readonly variable

# test變數也不能刪除
[root@Lyl ~]# unset test
-bash: unset: test: cannot unset: readonly variable

提示:不過declare -r命令是臨時生效,所以只要重新登錄或重啟,這個變數就會消失了。如果是要寫在配置文件中只讀變數,這個變數就永遠不能修改了。

5、補充:

declare命令其他常用屬性,用法同上。

-f 顯示函數名及函數定義。
-F 只顯示函數名(調試時附加行號和源文件)。
-l 增加小寫屬性,變數的值將轉換為小寫。
+l 刪除小寫屬性。
-u 增加大寫屬性,變數的值將轉換為大寫。
+u 刪除大寫屬性。