Shell-變數高階用法 (3) 有型別變數

wonbin發表於2020-01-04

我們知道在強型別語言中定義變數的時候必須為這個變數定義型別,比如定義整形可以定義為int型,字串 string型別,日期型別 Date 等等,在使用之前必須定義型別,這是強型別程式語言的風格。Shell 程式設計中,由於 Shell 是弱型別語言,在使用變數前不需要為變數宣告型別, 但其實 Shell 本身也是支援提前宣告有型別變數的,只是說使用方式和一般的強型別程式語言有些不同, 使用declaretypeset 命令來進行宣告。

  • declare 命令和 typeset 命令兩者等價
  • declaretypeset 命令都是用來定義變數型別的

好了,既然它們是等價的 那我們用 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 協議》,轉載必須註明作者和本文連結

相關文章