странная ошибка сценария оболочки: недопустимая опция return: использование: return [n]

Эта программа проверяет, существует ли определенное название книги, сопоставляя вводимые пользователем названия книги и автора книги.

function removebook_option()
{
    echo -n "Title : "
    read title_input2

    echo -n "Author: "
    read author_input2

    checkexist $title_input2 $author_input2
    error=$?
    echo "$error"

    if [ $error != -1 ];then
        #removebook
            echo "New book title $title_input removed successfully"
        else
        echo "Book does not exist"


    fi 

}

function checkexist()
{  
   counter=0

   for x in ${title[@]} 
   do

    for y in ${author[@]} 
    do
        if [  $x == $1 ] && [ $y == $2 ];
        then
            error=$counter 
                return "$error"
        fi
    done
    counter=$((counter+1))
   done

   error=-1
   return "$error"

}

title=(foo1 foo2)
author=(bar1 bar2)
removebook_option

Я получаю очень странную ошибку: function checkexist () возвращает 2 вместо -1, когда нет совпадения, что происходит при возврате значения error = -1

строка 43 : return: -1: неверная опция return: использование: return [n]

РЕДАКТИРОВАТЬ: По неизвестным причинам я могу возвращать только значения от 0 до 255, кто-нибудь знает, как вернуть отрицательные значения ??

Вы можете попробуйте ввести неверные данные, чтобы увидеть странную ошибку

Мне нужна помощь в разрешении этой проблемы, спасибо !!!!

0
задан 10 January 2014 в 14:29

1 ответ

Вы получаете эту ошибку:

line 43: return: -1: invalid option return: usage: return [n]

Это потому, что -1 интерпретируется как опция. Используйте это, -- означает «конец опций»:

return -- -1

, который возвращается с 255.


Рабочее решение:

#!/bin/bash

function removebook_option()
{
    echo -n "Title : "
    read title_input2

    echo -n "Author: "
    read author_input2

    error="$(checkexist "$title_input2" "$author_input2")" # <--
    echo "$error"

    if [[ "$error" != NOT_FOUND ]]; then # <--
        #removebook
        echo "New book title $title_input removed successfully"
    else
        echo "Book does not exist"
    fi 

}

function checkexist()
{  
   counter=0

   for x in "${title[@]}" # <--
   do
        for y in "${author[@]}" # <--
        do
            if [[  $x == $1 ]] && [[ $y == $2 ]]; # <--
            then
                error=$counter 
                echo "$error" # <--
                return
            fi
        done
        ((counter++)) # <--
   done

   error=NOT_FOUND # <--
   echo "$error"
   return
}

title=(foo1 foo2)
author=(bar1 bar2)
removebook_option

Редактирование, помеченное  # <--

Это работает вместо того, чтобы возвращать целочисленное значение, оно отображает его (записывает на экран). Обычно это выводит на терминал, однако синтаксис $( ... ) захватывает напечатанный вывод и присваивает его error в removebook_option(). Это позволяет «возвращать» любую строку, я сделал так, чтобы она возвращала дозорное значение NOT_FOUND, если не найдено.

Примечания:

  • Расширение массива должно быть заключено в двойные кавычки: "${author[@]}" и "${title[@]}"
  • Использовать [[ ... ]] вместо [ ... ].
0
ответ дан 10 January 2014 в 14:29

Другие вопросы по тегам:

Похожие вопросы: