我有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 :(得分: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
。