#!/bin/bash
i=$(awk '{x++} END {print x}' mibwithtraps)
echo $i
IFS=","
while read f1 f2 f3 f4
do
echo "hell :$f4"
done < mibwithtraps
这将打印出以下内容:
7
hell :CRITICAL,
hell :INFORMATIONAL,
hell :CRITICAL,
hell :INFORMATIONAL,
hell :INFORMATIONAL,
hell :INFORMATIONAL,
hell :CRITICAL,
我想将它们存储在一个数组中,我所有的尝试都失败了。我试过这个:
for ((w=1; w<=i; w++))
do
while read f1 f2 f3 f4
do
a[$w]= echo $f4
done
done < mibwithtraps
echo ${a[2]}
它的作用是打印以下内容:
7
CRITICAL
INFORMATIONAL
CRITICAL
INFORMATIONAL
INFORMATIONAL
INFORMATIONAL
CRITICAL
它们都作为一个整体存储在数组中。我希望它们分开,这样当我这样做时:
echo ${a[2]}
这应该发生:
INFORMATIONAL
答案1
你的程序大部分都不符合他的逻辑。
for ((w=1; w<=i; w++))
do
while read f1 f2 f3 f4
do
a[$w]= echo $f4
done
done < mibwithtraps
echo ${a[2]}
首先,for ((w=1; w<=i; i++)); do [...]; done < mibwithtraps
这毫无意义,因为你正在将 的内容重定向mibwithtraps
到for
循环。循环没有stdin
,它们是一种语言构造,而不是命令;我假设你想将 的内容重定向mibwithtraps
到read
:while read f1 f2 f3 f4; do [...]; done < mibwithraps
。
$f4
其次,您要从 开始存储 的内容$a{[1]}
,即数组的第二个位置,并且使用了错误的语法;要以这种方式存储命令的输出,您必须在子 shell 中运行它(a[$w]=$(echo $f4)
,但是您甚至不需要这样做,因为您可以简单地将 的值分配$4
给数组( );但此外,您还要在每个循环中将 的每一行的每个第四个分隔字段a[$w]=$f4
存储在数组的同一位置;因此,通过上述更正,您将得到一个数组,其中包含从第二个位置到第八个位置的最后一行的相同第四个分隔字段的值。for
,
mibwithtraps
$a
,
mibwithtraps
为了解决这个问题,作为一般规则,我建议您在第一次循环文件时将值存储到数组中;循环两次是没用的。由于数组(作为任何变量)不需要在中声明bash
,因此您可以直接为未声明的数组分配值;您还可以使用语法将元素附加到现有/不存在的数组中array+=(<value>)
:
#!/bin/bash
i=$(awk '{x++} END {print x}' mibwithtraps)
echo $i
IFS=","
while read f1 f2 f3 f4
do
echo "hell :$f4"
a+=("$f4")
done < mibwithtraps
echo ${a[1]}