1. 程式人生 > 實用技巧 >Shell語言學習(二)——變數和基本資料型別

Shell語言學習(二)——變數和基本資料型別

參考部落格:
[1]LinuxShell指令碼——變數和資料型別
[2]shell只讀變數刪除
一、變數

定義變數的語法
定義變數時,變數名和變數值之間使用“=”分隔,並且等號兩邊不能有空格:
    變數名=變數值

變數名規則
變數名的定義必須遵循以下規則:
1 命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
2 中間不能有空格,可以使用下劃線。
3 不能使用標點符號。
4 不能使用bash裡的關鍵字。

使用變數
使用一個定義過的變數,只要在變數名前面加美元符號即可,建議將變數名使用 {} 括起來之後再新增美元符號:
    echo ${name}

修改變數為只讀
使用readonly命令可以將變數定義為只讀變數,只讀變數的值不能被改變,也不能被刪除:
    readonly name

刪除變數
使用unset命令可以刪除變數,但不能刪除只讀變數:
    unset name


位置引數
執行Shell指令碼檔案時我們可以給它傳遞一些引數,這些引數在指令碼檔案內部可以使用 $n 的形式來接收。例如: $1 表示第一個引數, $2 表示第二個引數,依次類推。
如果引數個數達到或者超過了10個,那麼就得用 ${n} 的形式來接收了,例如: ${10} 、 ${23} 。 {} 的作用是為了幫助直譯器識別引數的邊界,這跟使用變數時加 {} 是一樣的效果。

指令碼內容:
#!/bin/bash
echo "第一個引數 : $1"
echo "第二個引數 : $2"
指令碼呼叫:
[root@localhost ~]# sh test.sh A B
執行結果:
第一個引數 : A
第二個引數 : B

特殊變數
除了位置引數以外,Shell中還有一些特殊變數,這些特殊變數描述了傳入引數的某些資訊:
1 $0:當前指令碼的檔名。
2 $n:n是一個數字,表示第幾個引數。
3 $#:傳遞給指令碼或函式的引數個數。
4 $*:傳遞給指令碼或函式的所有引數。當被雙引號""包含時,會將所有的引數從整體上看做一份資料,而不是把每個引數都看做一份資料。
5 $@:傳遞給指令碼或函式的所有引數。當被雙引號""包含時,仍然將每個引數都看作一份資料,彼此之間是獨立的。。
6 $?:上個命令的退出狀態,或函式的返回值。
7 $$:當前Shell的程序ID。對於Shell指令碼,就是這些指令碼所在的程序ID。

二、資料型別

1、字串
字串是shell程式設計中最常用最有用的資料型別,字串可以用單引號,也可以用雙引號,也可以不用引號。
建議使用雙引號,因為雙引號裡可以有變數和特殊字元,可以按照變數和特殊字元去使用。

宣告字串型別的變數:
    name="Sam"
拼接字串:
    hello="hello, $name !"
2、整數型
在Shell中所有的變數預設都是字串型。也就是說,如果不手工指定變數的型別,那麼所有的數值都是不能進行運算的:
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# c=$a+$b
[root@localhost ~]# echo $c
1+2
如果想要進行數學運算,可以使用“$((運算式))”或“$[運算式]”方式運算:
[root@localhost ~]# echo $(($a+$b))
3
[root@localhost ~]# echo $[$a+$b]
3
3、陣列
bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。用括號來表示陣列,陣列元素用空格符號分割開。定義陣列的一般形式為:
陣列元素的下標由0開始編號。獲取陣列中的元素要利用下標,下標可以是整數或算術表示式,其值應大於或等於0。

宣告陣列型別的變數:
    陣列名=(值1 值2 ... 值n)
也可以通過指定下標來宣告:
    陣列名[下標]=值
獲取陣列指定下標的值:
    ${陣列名[下標]}
使用“@”符號可以獲取陣列中的所有元素:
    ${陣列名[@]}