『忘了再學』Shell基礎 — 19、使用declare命令宣告變數型別

2022-05-25 12:01:07

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 刪除大寫屬性。