Linux Shell之二 變數與數組

來源:互聯網
上載者:User

標籤:linux   數組   變數   

一、什麼是變數

    Shell程式設計語言是非類型的解釋型語言,不像C++/JAVA語言編程時需要事先聲明變數,SHELL給一個變數賦值,實際上就是定義了變數,在Linux支援的所有shell中,都可以用賦值符號(=)為變數賦值。

    SHELL變數可分為兩類:局部變數和環境變數。局部變數只在建立它們的shell指令碼中使用。而環境變數則可以在建立它們的shell及其派生出來的任意子進程中使用。有些變數是使用者建立的,其他的則是專用shell變數。

例如在指令碼裡面定義A=123 ,定義這樣一個變數,前面變數名,後面是變數的值。

引用變數可以使用$A,把變數放在指令碼裡面會出現什麼樣的效果呢?如下:

#!/bin/bash#Author Jacken 2015-04-28A=123echo  “The number is  $A”執行指令碼:bash test.sh,結果將會顯示:The number is 123

簡單的理解變數,相當於定義一個別名-名稱,引用的時候加上$符號就可以了.

二、變數的操作與類型

定義變數

變數名和等號之間不能有空格,這可能和你熟悉的所有程式設計語言都不一樣。同時,變數名的命名須遵循如下規則: 

1、首個字元必須為字母(a-z,A-Z)。

2、中間不能有空格,可以使用底線(_)。

3、不能使用標點符號。

4、不能使用bash裡的關鍵字(可用help命令查看保留關鍵字)。

5、變數是嚴格區分大小寫。

使用變數

echo 把所在行輸出到螢幕。

使用一個定義過的變數,只要在變數名前面加貨幣符號($)

變數名外面的花括弧是可選的,加不加都行,加花括弧是為了協助解譯器識別變數的邊界,比如下面這種情況: 

[[email protected] ~]# A=hi[[email protected] ~]# echo $Ahi[[email protected] ~]# echo $Ahello[[email protected] ~]# echo ${A}hellohihello[[email protected] ~]#

推薦給所有變數加上花括弧,這是個好的編程習慣。

重新定義變數

已定義的變數,可以被重新定義,如:

[[email protected] ~]# cat test.sh #!/bin/bash##A=hiecho "The First variable is $A"A=helloecho "The Second variabe is $A"[[email protected] ~]# bash  test.sh The First variable is hiThe Second variabe is hello[[email protected] ~]#

唯讀變數

使用 readonly 命令可以將變數定義為唯讀變數,唯讀變數的值不能被改變。下面的例子嘗試更改唯讀變數,結果報錯: 

[[email protected] ~]# cat test.sh #!/bin/bash##A=hiB=hi2readonly A BA="hello"B="hello2"echo "The First variable is $A $B"[[email protected] ~]# bash test.sh test.sh: line 7: A: readonly variabletest.sh: line 8: B: readonly variableThe First variable is hi hi2[[email protected] ~]#

刪除變數

變數被刪除後不能再次使用;unset 命令不能刪除唯讀變數。

[[email protected] ~]# cat test.sh #!/bin/bash#A=hiB=hi2readonly Aunset A BA="hello"B="hello2"echo "The First variable is $A $B"[[email protected] ~]# bash test.sh test.sh: line 6: unset: A: cannot unset: readonly variabletest.sh: line 7: A: readonly variableThe First variable is hi hello2[[email protected] ~]#

變數名稱    =        等號右邊為空白,代表將變數值設為null

unset   變數名稱    不加任何選項,會先嘗試取消變數,若失敗,再試著取消與該變數同名的函數

unset -v 變數名稱    -v 表示要取消的是變數

unset -f 函數名稱    -f 表示要取消的是函數

"declare -x 變數名稱" 和 “export 變數名稱” 都可以把變數變成環境變數。

[email protected] ~]# A=hi[[email protected] ~]# B=hello[[email protected] ~]# declare -x A   //把A變成環境變數[[email protected] ~]# vim test.sh [[email protected] ~]# cat test.sh #!/bin/bash#echo "The  first variable is  $A"echo "The  second variable is  $B"[[email protected] ~]# bash test.sh The  first variable is  hiThe  second variable is   [[email protected] ~]# 或 [[email protected] ~]# C=one[[email protected] ~]# D=two[[email protected] ~]# export C    //把C變成環境變數[[email protected] ~]# bash[[email protected] ~]# echo $Cone[[email protected] ~]# echo $D[[email protected] ~]#

readonly        變數名稱 把變數設為唯讀變數

-f  函數名稱 設定該函數式不可修改

-a  陣列變數 -a後的陣列變數名稱是唯讀數組

declare -r      變數名稱 把變數設為唯讀變數

-a  變數名稱設定變數是一個數組

-p  變數名稱顯示變數的屬性       

-i  變數名稱變數是一個整數

-x  變數名稱變成環境變數

alias 別名=指令  

1、等號兩邊不能有空白 

2、等號右邊有空白字元,需要用引號‘‘,檔案位置在家目錄下.bashrc

運行shell時,會同時存在三種變數:

1) 局部變數

局部變數在指令碼或命令中定義,僅在當前shell執行個體中有效,其他shell啟動的程式不能訪問局部變數。

2) 環境變數 

所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常運行。必要的時候shell指令碼也可以定義環境變數。

3) shell變數

shell變數是由shell程式設定的特殊變數。shell變數中有一部分是環境變數,有一部分是局部變數,這些變數保證了shell的正常運行

特殊變數

\ 轉義,把具有特殊含義的字元轉為無代表意義的字串。

變數含義

$0 當前指令碼的檔案名稱 

$n 傳遞給指令碼或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。 

$# 傳遞給指令碼或函數的參數個數。 

$* 傳遞給指令碼或函數的所有參數(一個整體的字串)。 

[email protected] 傳遞給指令碼或函數的所有參數(一個個字串)。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。 

$? 上個命令的退出狀態,或函數的傳回值。 

$$ 當前Shell進程ID。對於 Shell 指令碼,就是這些指令碼所在的進程ID。 

[[email protected] ~]# chmod +x test.sh [[email protected] ~]# ./test.sh one two three four當前指令碼的檔案名稱標識符 $0 ./test.sh傳遞給指令碼的參數 $n  one three傳遞給指令碼的個數$# 4傳遞給指令碼的所有參數$* one two three four傳遞給指令碼的所有參數[email protected] one two three four上一個命令的狀態傳回值$? 0當前shell的進程ID$$ 17820[[email protected] ~]# cat test.sh #!/bin/bash#echo "當前指令碼的檔案名稱標識符 \$0 $0"echo "傳遞給指令碼的參數 \$n  $1 $3"echo "傳遞給指令碼的個數\$# $#"echo "傳遞給指令碼的所有參數\$* $*"echo "傳遞給指令碼的所有參數\[email protected] [email protected]"echo "上一個命令的狀態傳回值\$? $?"echo "當前shell的進程ID\$$ $$"[[email protected] ~]#

$* 和 [email protected] 的區別

從上邊的例子中,看起來$*和[email protected]輸出結果是一樣的,其實不然,$*輸出的是"one two three four"一個整體的字串,而[email protected]輸出的是one、two、three、four四個字串。

Other

在寫指令碼的時候,為了怕打錯變數名稱,造成排錯上的困難,我們可以規定:變數一律要先經過設定的程式才能使用。

shopt -s -o nounset

-s 是開啟選項的意思;

-o 是指可用set -o設定的選項

nounset表示變數一定要先設定過,才能使用

三、數組

數組是一種資料結構,由相關的資料項目組成。每個資料項目稱為,稱為數組的元素,且可使用索引的方式取得各元素的值。

bash的數組,其元素的個數沒有限制,數組的索引由0開始,但不一定要連續(可以跳號)。

顯示或取得某一元素的值${數組[索引值]},例 數組A的第3個元素為${A[2]}。索引是可以做算術運算的。

使用數組的索引時,第一個元素由0開始,第n個元素的索引值為n-1

echo ${數組[@]} 取出所有元素,得到的是以空格隔開的字元

echo ${數組[*]} 取出所有元素,得到的是一串字串

echo${#數組[@]}或echo ${#數組[*]}取得數組元素的個數

unset 數組 取消數組

unset 數組[2]   取消數組中的第3個元素

[[email protected] ~]# cat test.sh #!/bin/bash#A[0]=5A[1]=15A[3]=17A[4]=19echo "\${A[@]}代表數組A的所有元素(空格隔開的字串)${A[@]}"echo "\${A[*]}代表數組A的所有元素(代表一個整體字串)${A[*]}"echo "\${#A[@]}代表數組A的元素個數${#A[@]}"echo "\${#A[*]}代表數組A的元素個數${#A[*]}"[[email protected] ~]# [[email protected] ~]# bash test.sh ${A[@]}代表數組A的所有元素(空格隔開的字串)5 15 17 19${A[*]}代表數組A的所有元素(代表一個整體字串)5 15 17 19${#A[@]}代表數組A的元素個數4${#A[*]}代表數組A的元素個數4[[email protected] ~]#

本文出自 “Welcome To Linux World” 部落格,請務必保留此出處http://linuxnote.blog.51cto.com/9876511/1641142

Linux Shell之二 變數與數組

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.