Linux
如何在 bash 中使用字元串數組
我寫了以下腳本
load函式應該設置數組
disk[a]=1
等等disk[b]=2
然後函式 out 應該列印數組
${disk[a]}
, and${disk[b]}
, 等等但是我們從函式中得到的總是數字
4
相反,我想得到以下內容:
1 2 3 4
這裡有什麼問題?
如何修復它以便功能輸出將列印:
1 2 3 4
劇本:
#!/bin/bash function load { counter=1 for input in a b c d do disk[$input]=$counter let counter=$counter+1 echo ${disk[$input]} done } function out { counter=1 for input in a b c d do echo ${disk[$input]} let counter=$counter+1 done } echo "run function load" load echo "run function out" out
輸出:
./test run function load 1 2 3 4 run function out 4 4 4 4
Bash 數組預設是索引數組:
如果使用語法分配了任何變數,則會自動創建索引數組
name[subscript]=value
…但是您使用字母作為索引,因此您可能需要一個關聯數組,這意味著您需要一個:
declare -A disk
在呼叫函式之前。
看看初始化數組時會發生什麼:
$ i=0; for k in a b c d; do A[$k]=$((i++)); done; declare -p A declare -a A=([0]="3")
只有一個元素存在,它的索引為零。
預設情況下,數組由 numbers索引,並且您使用的索引的數值恰好全為零。實際上,在算術上下文中,就像正常數組的下標一樣,字元串被用作變數的名稱,並使用該變數的值。因此,如果我們將
a
,b
… 設置為數字,那麼我們會得到不同的結果:$ a=123; b=456; c=789; d=999; i=0; $ for k in a b c d; do A[$k]=$((i++)); done; $ declare -p A declare -a A=([123]="0" [456]="1" [789]="2" [999]="3")
declare -A arrayname
要實際將字元串本身用作索引,請首先使用or將數組聲明為關聯數組typeset -A arrayname
:$ unset A; declare -A A; i=0; $ for k in a b c d; do A[$k]=$((i++)); done; declare -p A declare -A A=([a]="0" [b]="1" [c]="2" [d]="3" )