#!/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
Ваша программа перестала работать главным образом в его логику.
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
к a for
цикл. Циклы не имеют stdin
, они - конструкция языка, не команды; я предполагаю, что Вы хотели перенаправить содержание mibwithtraps
кому: read
вместо этого: while read f1 f2 f3 f4; do [...]; done < mibwithraps
.
Во-вторых, Вы храните содержание $f4
запуск с $a{[1]}
, который является вторым положением массива, и Вы делаете его с помощью неправильного синтаксиса; для хранения вывода команды таким образом, необходимо выполнить его в подоболочке (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]}