Эта программа проверяет, существует ли определенное название книги, сопоставляя вводимые пользователем названия книги и автора книги.
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, кто-нибудь знает, как вернуть отрицательные значения ??
Вы можете попробуйте ввести неверные данные, чтобы увидеть странную ошибку
Мне нужна помощь в разрешении этой проблемы, спасибо !!!!
Вы получаете эту ошибку:
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[@]}"
[[ ... ]]
вместо [ ... ]
.