Ошибка при попытке вызвать переменную массива в арифметике - PullRequest
0 голосов
/ 01 октября 2018

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

Вот код:

#! /system/bin/bash

#Declaring y, L and T
declare -a y=()
declare -a L=()
declare -a T=()
y=(1 2 3 4 5 6)
L[1]=12
T[1]=5

#Finding all Levels of (L) sub t 
ycount=$(( ${#y[@]} + 1 ))                      
begin=1
counter=2

while [ $begin -lt $ycount ]
do                                                                         
     L[$counter]=$( echo "($alpha * ${y[$begin]}) + ((1 - $alpha) *(${L[$begin]} + ${T[$begin]}))" | bc -l)
     begin=$(( $begin + 1 ))
     counter=$(( $counter + 1 ))
done

Это происходит, когда вы запускаете код:

$ bash /tmp/test.sh
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error

Я почти уверен, что ошибка в вызовах L [$ begin] и T [$ begin], как при замене чисел на эти переменные.больше не получает синтаксическую ошибку.

1 Ответ

0 голосов
/ 01 октября 2018

Это синтаксические ошибки bc: переменная $alpha не инициализирована.

Вот что происходит при включении трассировки оболочки:

$ bash -x /tmp/test.sh
+ y=()
+ declare -a y
+ L=()
+ declare -a L
+ T=()
+ declare -a T
+ y=(1 2 3 4 5 6)
+ L[1]=12
+ T[1]=5
+ ycount=7
+ begin=1
+ counter=2
+ '[' 1 -lt 7 ']'
++ bc -l
++ echo '( * 2) + ((1 - ) *(12 + 5))'
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
+ L[$counter]=
+ begin=2
... and so on

Вы также страдаете отошибки индексации массива "off by one":

$ y=(1 2 3 4 5 6)
$ declare -p y
declare -a y=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6")
# .............^

Вы также никогда не назначаете массив T, поэтому, как только begin> 1, $ {T [$ begin]} будет пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...