我們知道在強型別語言中定義變數的時候必須為這個變數定義型別,比如定義整形可以定義為int
型,字串 string
型別,日期型別 Date
等等,在使用之前必須定義型別,這是強型別程式語言的風格。Shell 程式設計中,由於 Shell 是弱型別語言,在使用變數前不需要為變數宣告型別, 但其實 Shell 本身也是支援提前宣告有型別變數的,只是說使用方式和一般的強型別程式語言有些不同, 使用declare
和 typeset
命令來進行宣告。
declare
命令和typeset
命令兩者等價declare
、typeset
命令都是用來定義變數型別的
好了,既然它們是等價的 那我們用 declare
進行演示
declare
常用命令參數列
引數 | 含義 |
---|---|
-r | 將變數設為只讀 |
-i | 將變數設為整數 |
-a | 將變數定義為陣列 |
-f | 顯示此指令碼定義過的所有函式及內容 |
-F | 僅顯示此指令碼定義過的函式名 |
-x | 將變數宣告為環境變數 |
declare -r
演示, 只讀屬性還有一個命令 readonly
[wonbin@localhost shell]$ var1="aaa bbb"
[wonbin@localhost shell]$ declare -r var1
[wonbin@localhost shell]$ echo $var1
aaa bbb
[wonbin@localhost shell]$ var1="xxxx oooo"
-bash: var1: readonly variable
[wonbin@localhost shell]$ var3="asdfasd "
[wonbin@localhost shell]$ readonly var3
[wonbin@localhost shell]$ var3="dasfa "
-bash: var3: readonly variable
declare -i
演示
[wonbin@localhost shell]$ num1=10
[wonbin@localhost shell]$ num2=$num1+20 // 預設當做字串處理
[wonbin@localhost shell]$ echo $num2
10+20
[wonbin@localhost shell]$ expr $num1 + 10
20
[wonbin@localhost shell]$ declare -i num3
[wonbin@localhost shell]$ echo $num3
[wonbin@localhost shell]$ num3=$num1+90
[wonbin@localhost shell]$ echo $num3
100
declare -f
在shell中將系統定義好的函式,包括函式名及函式體 列印出來
[wonbin@localhost shell]$ declare -f | less
__HOSTNAME ()
{
local zero=0;
local ret=0;
local cur_word="$2";
if [ "$1" == "X" ]; then
return;
else
if [ "$1" == "match" ]; then
return 0;
else
if [ "$1" == "complete" ]; then
COMPREPLY=($(compgen -A hostname -- $cur_word));
fi;
fi;
fi;
return 0
}
__SIZE ()
{
return 0
}
__SLAVEURL ()
{
return 0
}
__VOLNAME ()
直接拿來用, 這裡用第一個函式做演示
[wonbin@localhost shell]$ __HOSTNAME "complete"
[wonbin@localhost shell]$ echo $COMPREPLY
localhost
declare -F
只列印函式名, 不列印方法體
[wonbin@localhost shell]$ declare -F | less
declare -f __HOSTNAME
declare -f __SIZE
declare -f __SLAVEURL
declare -f __VOLNAME
declare -f __expand_tilde_by_ref
declare -f __get_cword_at_cursor_by_ref
declare -f __git_aliased_command
declare -f __git_aliases
declare -f __git_commands
declare -f __git_complete
declare -f __git_complete_diff_index_file
declare -f __git_complete_file
declare -f __git_complete_index_file
declare -f __git_complete_remote_or_refspec
declare -f __git_complete_revlist
declare -f __git_complete_revlist_file
declare -f __git_complete_strategy
declare -f __git_compute_all_commands
declare -f __git_compute_merge_strategies
declare -f __git_compute_porcelain_commands
declare -f __git_config_get_set_variables
declare -f __git_count_arguments
declare -f __git_diff_index_files
declare -a array_name
宣告陣列, 然後 array_name=(value1 ... valuen)
, 這裡不宣告也可以
陣列的一些操作:
- 刪除元素:
unset my_arr[2]
清除元素 unset my_arr
清空整個陣列
[wonbin@localhost shell]$ my_arr=(3 "cccd")
[wonbin@localhost shell]$ echo ${my_arr[*]}
3 cccd
[wonbin@localhost shell]$ unset my_arr[1]
[wonbin@localhost shell]$ echo ${my_arr[@]}
3
[wonbin@localhost shell]$ unset my_arr
[wonbin@localhost shell]$ echo ${my_arr[@]}
[wonbin@localhost shell]$
- 分片訪問:
${array[@]:1:3}
陣列下標從1 到3 的三個元素,[wonbin@localhost shell]$ m_array=("arsenal" "livepool" "manchester city" "chelsea" "hot spur") livepool manchester city chelsea
- 內容替換:
${my_array[@]/an/AN}
將陣列中所有元素內包含 an 的子串替換為 AN[wonbin@localhost shell]$ my_array=("an1" "an2" "an3" "an4") [wonbin@localhost shell]$ echo ${my_array[@]/an/AN} AN1 AN2 AN3 AN4
- 陣列遍歷:
for v in ${my_array[@]} do echo $v done
declare -x
宣告為環境變數,可以直接在指令碼中使用
取消宣告的變數:
- declare +r
- declare +i
- declare +a
- declare +x
本作品採用《CC 協議》,轉載必須註明作者和本文連結