This programme checks if a certain book title exist by matching user input of book title and book author.
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_optionI am getting a very weird error , where function checkexist() returns 2 instead of -1 when there isnt a match which happens when returning value error=-1
line 43: return: -1: invalid option return: usage: return [n]
EDIT : For reasons unknown , i can only return values from 0-255 , does anyone know how to return negative values??
You can try to input incorrect data to see the weird error
I need help resolving this issue thanks!!!!
31 Answer
You're getting this error:
line 43: return: -1: invalid option return: usage: return [n]This is because the -1 is interpreted as an option. Use this, -- means 'end of options':
return -- -1which returns with 255.
Working solution:
#!/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_optionEdits marked with # <--
This works by instead of returning an integer value, it echoes it (writes to screen). Usually, this would print to the terminal however the $( ... ) syntax captures the printed output, and assigns it to error in removebook_option(). This allows 'returning' any string, I've made it return a sentinel value of NOT_FOUND if not found.
Notes:
- Array expansion should be wrapped with double quotes:
"${author[@]}"and"${title[@]}" - Use
[[ ... ]]instead of[ ... ].