2 Размерных Ошибки массива в оболочке

#!/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
0
задан 15 June 2015 в 08:47

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 к 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]}
1
ответ дан 1 August 2019 в 10:11

Другие вопросы по тегам:

Похожие вопросы: