Рейтинг:0

Я продолжаю получать ошибку: «arr [$ i] не является допустимым идентификатором» в сценарии bash

флаг ph

Я практикую серию Фибоначчи на сценарии bash с массивами и циклом for, но я получил эту ошибку

jrnl6T2.sh: строка 10: `arr[$i]': недопустимый идентификатор

Вот файл .sh

#! /бин/баш

read -p "Введите термин: " термин

обр[0]=0
обр[1]=1
для (( i=2; i<$term; i++))
делать

    arr[$i]= expr $((arr[$i-2]+arr[$i-1]))
    
сделано

для ((j=0; j<$term; j++))
делать
    эхо ${обр[$j]}
    
сделано

Поскольку я новичок, поэтому не знаю, почему я получаю эту ошибку. Я тоже гуглил эту проблему, но не нашел подходящего решения. Я использую убунту 20.04.3.

Рейтинг:2
флаг cn

Вы делаете две неправильные вещи в операторе вычисления выражения:

  1. Вы поставили пробел после = подписать. Вы не можете использовать пробел до или после знак равенства.

  2. выражение является командой. Чтобы захватить и назначить его вывод, вам нужно заключить его в $(), как это:

    arr[i]=$(expr $((arr[i-2]+arr[i-1])))
    

    или же

    arr[i]=$(выражение ${arr[i-2]} + ${arr[i-1]})
    

    Обратите внимание, что выражение команда в первом случае ничего не делает; в $(()) конструкция вычисляет выражение.

Однако я предлагаю вам выполнять арифметические операции Bash, используя позволять команда.

Ваш скрипт можно исправить так:

#!/бин/баш
read -p "Введите термин: " термин
пусть обр[0]=0
пусть обр[1]=1
для (( я = 2; я <термин; я ++ ))
делать
  пусть arr[i]=arr[i-2]+arr[i-1]
сделано
для ((j=0; j<term; j++))
делать
  эхо ${обр[j]}
сделано

Другая альтернатива (эквивалентная позволять команда, но я бы не предпочел) это:

приб[i]=$(( приб [i-2] + приб [i-1] ))
Linear Data Structure avatar
флаг ph
можете ли вы объяснить, почему вы заменили `arr[$i]` на `arr[i]`. Я проверил, оба термина дают одинаковый результат
FedKad avatar
флаг cn
Я думаю, что это исходит от Korn Shell. См. конец раздела 6.4.1 на странице https://docstore.mik.ua/orelly/unix3/korn/ch06_04.htm.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.