arrays - 在 bash v.3 中迭代数组

标签 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 代码是正确的还是需要修改某些地方?

最佳答案

这对我来说看起来是正确的,因为考虑到您之前刚刚创建了它们并且知道数组的键将在 0,1,...,n-1 中,因此您使用适当的方式遍历数组 用于大小为 n 的数组。 array+=(elements) 运算符总是将 elements 放入 array 中,从 array 的最后一个索引 + 1 开始。

我会以不同方式遍历数组的唯一情况是不能保证索引位于 [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 功能。

关于arrays - 在 bash v.3 中迭代数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42227505/

相关文章:

linux - 如何在没有密码的情况下使用命令 "sudo adduser test"?

c++ - 如何正确传递这些值?

javascript - 使用键属性显示不同的值

javascript - 根据每个数组项内的值重复数组项 x 次

bash - 获取 block 设备的文件系统十六进制 ID,如所示 "fdisk"

linux - sftp 使用 shell 脚本将文件从 Windows 服务器复制到 Linux 服务器

javascript - JS 将数组值合并为一个值

linux - 在 Bash 中,为什么 `cd//` 起作用(并且等于 `cd/` )?

Ruby:使用 'echo' 选项执行 shell 命令 '-n'

bash - ∴ 字符在 bash shell 中有什么作用?