Linux

如何在 bash 中使用字元串數組

  • November 1, 2018

我寫了以下腳本

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" )

引用自:https://unix.stackexchange.com/questions/479177