2017-02-05 10 views
1

Я пытаюсь построить цикл while, который обновляет значения в массиве, но я продолжаю получать команду, не найденную ошибку.Однострочный цикл обновления цикла

i=1 
bool=true 
declare -a LFT 
declare -a RGT 
while read -r line; do 
    ${LFT[$i]}=${line:0:1}; ${RGT[$i]}=$(wc -l < temp$i.txt); 
    if [ ${LFT[$i]} -ne ${RGT[$i]} ]; then 
    $bool=false; 
    fi; 
    ((i=i+1)); 
done<output2.txt 

Файл Читаю из содержит одну цифру в каждой строке, и я хочу, чтобы заполнить массив LFT с каждой записи является цифрой. Массив RGT должен быть заполнен количеством строк файлов, обозначенных temp * .txt. И я хочу проверить, чтобы каждая запись этих двух массивов была одинаковой.

Однако я все равно получаю сообщение об ошибке: command = # not found, где # - какая-либо цифра находится в строке в файле. Я неправильно присваиваю значения массивам? Кроме того, я получаю ошибку: команда true = false не найдена. Я предполагаю, что это имеет какое-то отношение к присвоению значений булевому. Благодаря

ответ

1

Вопрос находится на этих линиях:

${LFT[$i]}=${line:0:1}; ${RGT[$i]}=$(wc -l < temp$i.txt); 

изменить его на:

LFT[$i]=${line:0:1}; RGT[$i]=$(wc -l < temp$i.txt); 

Действительно задание в оболочке должно быть:

var=<expression> 

вместо

$var=<expression> ## this will be interpreted by the shell as a command 

Это одна из распространенных ошибок, которые делают программисты Bash. Подробнее Bash pitfalls здесь.

+1

Вау, это было такое простое исправление. Спасибо –

+0

Есть ли способ отладки, чтобы узнать, где лежат проблемы, или вы просто знаете по опыту? –

+0

Некоторые из этих вещей приходят с практикой. Тем не менее, вы всегда можете передать свой код через http://www.shellcheck.net/ - это замечательный инструмент. И SO - прекрасное место для изучения Bash, среди многих других вещей. – codeforester