shell将字符串添加到数组中

时间:2014-01-14 18:50:43

标签: arrays bash shell

我在循环中向字符串添加字符串时遇到了一些麻烦。由于某种原因,它总是添加相同的行。这是我的代码:

declare -a properties
counter=0

while read line
do

    if [[ ${line} == *=* ]]
    then
        properties[${counter}]=${line}
        (( counter=counter + 1 ))
    fi
done < ${FILE}

for x in ${!properties[@]}
do
    echo "the value is $properties[x]"
done

由于某种原因,数组中的每个元素都是文件中的第一行。我一定做错了什么,只是不确定是什么。

非常感谢任何帮助

4 个答案:

答案 0 :(得分:4)

试试这个脚本:

declare -a properties
while read line
do
   [[ "${line}" == *=* ]] && properties+=("$line")
done < "${FILE}"

for x in "${properties[@]}"
do
   echo "the value is "$x"
done

答案 1 :(得分:1)

作为@twalberg mentions in this comment,问题不在顶部循环中,而是在底部循环中:

for x in ${!properties[@]}
do
    echo "the value is $properties[x]"
done

数组引用总是需要大括号{ ... }才能正确扩展。

  

由于某种原因,数组中的每个元素都是第一行   文件。

不是这样。数组已正确填充,但您需要更改对数组的引用:

echo "the value is $properties[x]"

为:

echo "the value is ${properties[x]}"

只是一个简单的疏忽。

答案 2 :(得分:0)

向元素添加元素的一种更简单的方法是简单地使用语法:

VARNAME+=("content")

另外,正如所写,你的错误可能在这里:

(( counter=counter + 1 ))

它可能应该是以下三种中的一种:

(( counter=$counter + 1 ))
counter+=1
counter=$[$counter+1]
counter=$(($counter + 1))

答案 3 :(得分:0)

这个KornShell(ksh)脚本对我来说很好。如果有的话,让我知道。

<强> readFileArrayExample.ksh

#! /usr/bin/ksh

file=input.txt
typeset -i counter=0

while read line
do
    if [[ ${line} == *=* ]]; then
        properties[${counter}]="${line}"
        ((counter = counter + 1))
        echo "counter:${counter}"
    fi
done < "${file}"

#echo ${properties[*]}

for x in "${properties[@]}"
do
    echo "${x}"
done

readFileArrayExample.ksh输出:

@:/tmp #ksh readFileArrayExample.ksh
counter:1
counter:2
counter:3
a=b
a=1
b=1
@:/tmp #

<强> input.txt中

a-b
a+b
a=b
a=1
b=1
1-a