我在将字符串添加到循环中的数组时遇到一些问题。出于某种原因,它总是添加相同的行。这是我的代码:
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
出于某种原因,数组中的每个元素都是文件中的第一行。我一定是做错了什么,只是不知道是什么。
任何帮助将不胜感激
试试这个脚本:
declare -a properties
while read line
do
[[ "${line}" == *=* ]] && properties+=("$line")
done < "${FILE}"
for x in "${properties[@]}"
do
echo "the value is "$x"
done
正如@twalberg在此评论中提到的,问题不在于顶部循环,而在于底部循环:
for x in ${!properties[@]}
do
echo "the value is $properties[x]"
done
数组引用始终需要大括号{ ... }
才能正确扩展。
由于某种原因,数组中的每个元素都是 文件。
并非如此。数组已正确填充,但您需要将对数组的引用从:
echo "the value is $properties[x]"
自:
echo "the value is ${properties[x]}"
只是一个简单的疏忽。
将元素添加到数组的一种更简单的方法是简单地使用以下语法:
VARNAME+=("content")
另外,如前所述,您的错误可能在这里:
(( counter=counter + 1 ))
它可能应该是以下三个之一:
(( counter=$counter + 1 ))
counter+=1
counter=$[$counter+1]
counter=$(($counter + 1))
<</div>
div class="one_answers"> 这个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 #
输入.txt
a-b
a+b
a=b
a=1
b=1
1-a