在bash v.3中迭代数组

时间:2017-02-14 13:31:52

标签: arrays bash shell

我有file.properties,其中定义了键和值:

key1=value1 value2 value3
key2=value4 value5 value6
key3=value7 value8 value9

我想将文件中的行加载到数组中。由于bash 3,我不能使用declare -A来创建关联数组。

在bash 4中我的代码是:

conf="./file.properties"

init() {
local configiration=$1
if [ -f "$conf" ]
then
    while IFS='=' read -r key value
    do
        configuration[ ${key} ]=$value
    done < "$conf"
fi}
declare -A configuration
init configuration

KEY="key value from file"
#KEY="key1" or KEY="key2" or KEY="key3"
SERVERS=${configuration[ $KEY ]}

我想在 bash 3 中做同样的工作。

conf="./file.properties"
init () {
key=()
value=()
if [ -f "$conf" ]
then
    while IFS='=' read -r key value
    do
        key+=("$key")
        value+=("$value")
    done < "$conf"
fi}
init
KEY="key value from file"
#KEY="key1" or KEY="key2" or KEY="key3"
for ((i = 0; i < ${#key[@]}; i++))
    do
    if [ "${key[$i]}" == "$KEY" ]; 
    then
        echo "values: ${value[i]}"
    fi
done

在这两种情况下,我得到相同的输出,例如:

value1 value2 value3

我的bash 3代码是正确还是必须修改?

1 个答案:

答案 0 :(得分:0)

这对我来说是正确的,因为你使用适当的方法迭代你的数组,考虑到你之前刚创建它们并且知道数组&#39;对于大小为0,1,...,n-1的数组,密钥将位于n中。从array+=(elements)的最后一个索引+ 1开始,elements运算符始终将array放入array

我将以不同方式迭代数组的唯一情况是,如果不能保证索引在[0,n)中。例如:

declare -ai roots=();
declare -i x y;
for ((x=0; x<4; roots[x*x]=x,++x)) do :; done;
for y in "${!roots[@]}"; do
    printf 'sqrt(%d) = %d\n' $y ${roots[y]};
done;

通过使用"${!roots[@]}"扩展roots的索引来迭代它,我们得到以下输出:

sqrt(0) = 0
sqrt(1) = 1
sqrt(4) = 2
sqrt(9) = 3

在这种情况下,我们必须避免使用算术for循环来避免发生以下情况:

$ for((i=0;i<${#roots[@]};++i)); do echo "${roots[i]}"; done;
0
1
 
 

我要做的唯一改变是使用[[而不是[来执行字符串比较,因为它是一个bash内置,一般使用更安全,更有效。另外,我认为您需要在;关闭}功能之前使用换行符或init