我有 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/