function bookExistCheck {

    for i in "${bookTitle[@]}"
    do
        if [ "$1" == "${bookTitle[$i]}" ]; then
            if [ "${bookAuthor[$i]}" == "$2" ]; then
                bookExist=true
                echo "Book already exist in database."
            fi
        fi
    done

}

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

 if [ "$1" == "{$bookTitle[$i]}" ]; then

Ошибка говорит

./menu.sh: строка 25: Гарри Поттер - Принц-полукровка: синтаксическая ошибка в выражении (токен ошибки - «Поттер - Принц-полукровка»)

Я новичок в BASH, поэтому предполагаю, что это ошибка синтаксиса?

0
dirkaka 18 Июл 2017 в 11:06
Попробуйте "${bookTitle[$i]}"
 – 
delta
18 Июл 2017 в 11:10
Разве это не то, что мой код сейчас? Если вы имели в виду изменить [@] на [$ i], это тоже не сработает.
 – 
dirkaka
18 Июл 2017 в 11:14
Извиняюсь. у вас одна строка if [ "$1" == "{$bookTitle[$i]}" ]; then. Но полный код функции правильный.
 – 
delta
18 Июл 2017 в 11:15
Вы можете ввести bookExistCheck, а также bookTitle и bookAuthor?
 – 
delta
18 Июл 2017 в 11:18
Мне жаль, но я все еще не понимаю, что вы предлагаете. Эта строка предназначена для сравнения того, что я сохранил в $ bookTitle [i], с первым переданным аргументом, который хранится в $ 1.
 – 
dirkaka
18 Июл 2017 в 11:19

1 ответ

Лучший ответ

Когда вы пишете for i in "${bookTitle[@]}", i не является индексом массива, это уже элемент массива.

Попробуйте написать что-то вроде этого: if [ "$1" == "${i}" ]; then

ИЗМЕНИТЬ

Вы также можете использовать цикл for:

for (( i=0; i<=${#bookTitle[@]}; i++ )); do 

В этом случае i будет принимать индексы от 0 до bookTitle.

1
Vadim Beskrovnov 18 Июл 2017 в 11:27
Боже мой ... Я перепутал этот цикл for с другим циклом for ($ i = 0; $ i ++ ....) Спасибо за это. Ваше предложение сработает, но у меня есть еще один аргумент автора книги, который мне нужно сравнить. Должен ли я просто поместить еще один цикл for в цикл bookTitle?
 – 
dirkaka
18 Июл 2017 в 11:26