2014-09-23 5 views
0

Внутри цикла У меня есть переменная, которая будет использоваться для расчета, используя bc, другой переменной. Однако результат, который я получаю, абсолютно неверен. У меня есть 32 файла с именем test0, test1 и так далее. Мой сценарий читает следующим образом:Как использовать bc внутри цикла for

for i in {0..31}; do 
    declare x$i=$(wc -l < test$i) 
    declare y$i=$(echo $x$i/10 | bc) 
done 

для переменной x, я получаю хорошие результаты, то есть каждый x$i хранит количество строк корреспондента test$i. Тогда я хотел бы знать, насколько 10% каждого x$i и хранит его в переменных y$i. И, как я сказал выше, я получаю совершенно неправильные результаты, используя этот скрипт. Например, для x0 = 155287510 У меня есть y0 = 20.

+0

Какие результаты вы получаете? Какие результаты вы ожидаете? Что такое 'test $ i'? – terdon

+0

@terdon Я только что отредактировал свой вопрос – ziulfer

+0

Возможно, вам нужно установить 'scale' ....' echo 'scale = 2; 10/3 "| bc' –

ответ

6

Проблема заключается в том, что $x$i не значение переменной с именем x$i но конкатенация значений переменных x и i.

Вы можете преобразовать свой скрипт, чтобы легко использовать массивы Bash, но, похоже, вам будет лучше делать это в Awk.

declare -a x 
declare -a y 
for i in {0..31}; do 
    x[$i]=$(wc -l < test$i) 
    y[$i]=$(echo "${x[$i]}"/10 | bc) 
done 

Если вы просто хотите, результат вычисления,

wc -l test[0-9] test[12][0-9] test3[01] | 
awk '{$1 /= 10 }1' 
+0

Я не думаю, что его даже стоит порождать 'bc' каждую итерацию цикла, когда оболочка будет радостно делить на 10 себя' y [$ i] = $ (($ {x [$ i]}/10)) '. (Разумеется, 'bc' более полезен, если требуются десятичные результаты.) –

+0

Или, если вы не заботитесь о округлении, просто оставьте последнюю цифру -' $ {x [$ i]%?} ' – tripleee

+0

Я считал, что но это приведет к пустой строке для 1-значных чисел –

Смежные вопросы