內(nèi)建命令declare
和 typeset
是完全相同的命令备籽,其被用于修改變量的屬性舶治。相比起一部分編程語言來說,這種修改屬于非常弱的類型標(biāo)注方式。declare
命令只有在 Bash version 2 及更高版本才能使用霉猛,而 typeset
命令可以在 ksh 腳本中運(yùn)行
declare/typeset 命令選項(xiàng)
-r 只讀(readonly)
( declare -r var1 與 readonly var1 的作用相同 )
該選項(xiàng)約等于 C 語言中的類型限定符 const
尺锚,任何嘗試修改只讀變量的行為都會(huì)導(dǎo)致腳本出錯(cuò)
declare -r var1=1
echo "var1 = $var1" # var1 = 1
(( var1++ )) # x.sh: line 4: var1: readonly variable
-i 整型(integer)
declare -i number
# 腳本會(huì)將之后所有出現(xiàn)的 "number" 變量的類型都視作整型。
number=3
echo "Number = $number" # Number = 3
number=three
echo "Number = $number" # Number = 0
# 腳本試圖將字符串 "three" 視為整型韩脏。
被視為整型的變量無需命令 expr
或是 let
即可進(jìn)行數(shù)學(xué)運(yùn)算
n=6/3
echo "n = $n" # n = 6/3
declare -i n
n=6/3
echo "n = $n" # n = 2
-a 數(shù)組(array)
declare -a indices
變量 indices
會(huì)被視作 數(shù)組
-f 函數(shù)(function)
declare -f
如果沒有在 declare -f 后帶上任何參數(shù)缩麸,該語句將會(huì)列出在腳本中已經(jīng)定義的所有函數(shù)
declare -f function_name
而 declare -f function_name 則僅僅列出名為 function_name 的函數(shù)
-x 導(dǎo)出(export)
declare -x var3
該語句聲明了變量 var3 可以導(dǎo)出到該變量所屬腳本之外的 shell 環(huán)境中
-x var=$value
declare -x var3=373
eclare 命令允許在設(shè)置變量屬性的同時(shí)給變量賦值
樣例-1. 使用 declare 命令標(biāo)注變量類型
#!/bin/bash
func1 ()
{
echo This is a function.
}
declare -f # 顯示上面的所有函數(shù)。
echo
declare -i var1 # var1 是一個(gè)整型變量赡矢。
var1=2367
echo "var1 declared as $var1"
var1=var1+1 # 整型變量的運(yùn)算可以省略 let 命令杭朱。
echo "var1 incremented by 1 is $var1."
# 嘗試修改整型變量相恃。
echo "Attempting to change var1 to floating point value, 2367.1."
var1=2367.1 # 報(bào)錯(cuò)谍椅,并且 var1 的值并沒有被修改。
echo "var1 is still $var1"
echo
declare -r var2=13.36 # 'declare' 允許在設(shè)置變量屬性時(shí)譬挚,
#+ 同時(shí)給變量賦值空民。
echo "var2 declared as $var2" # 嘗試修改只讀變量刃唐。
var2=13.37 # 報(bào)錯(cuò),然后腳本異常結(jié)束界轩。
echo "var2 is still $var2" # 這行語句將不會(huì)被執(zhí)行画饥。
exit 0 # 腳本也不會(huì)從這里結(jié)束。
使用內(nèi)建命令 declare
還可以限制變量的 作用域
foo ()
{
FOO="bar"
}
bar ()
{
foo
echo $FOO
}
bar # 輸出 bar浊猾。
foo(){
declare FOO="bar"
}
bar ()
{
foo
echo $FOO
}
bar # 什么都不會(huì)輸出抖甘。
注記
在本書中,變量類型標(biāo)注(typing)是指指定變量類型并限制其屬性
例如一個(gè)變量被 declared
或是 typed
命令聲明為整型葫慎,則該變量不再適用于各種 字符串操作
declare -i intvar
intvar=23
echo "$intvar" # 23
intvar=stringval
echo "$intvar" # 0
declare 的另類用法
declare
命令可以幫助用戶識(shí)別變量衔彻、環(huán)境變量或是其他信息,與 數(shù)組
搭配效果更佳
bash$ declare | grep HOME
HOME=/home/bozo
bash$ zzy=68
bash$ declare | grep zzy
zzy=68
bash$ Colors=([0]="purple" [1]="reddish-orange" [2]="light green")
bash$ echo ${Colors[@]}
purple reddish-orange light green
bash$ declare | grep Colors
Colors=([0]="purple" [1]="reddish-orange" [2]="light green")