奇怪的 shell 脚本错误:无效选项返回:用法:返回

奇怪的 shell 脚本错误:无效选项返回:用法:返回

该程序通过匹配用户输入的书名和书籍作者来检查某个书名是否存在。

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 而不是 -1error=-1

第 43 行:返回:-1:无效选项返回:用法:返回 [n]

编辑:由于未知的原因,我只能返回 0-255 之间的值,有人知道如何返回负值吗?

你可以尝试输入错误的数据来查看奇怪的错误

我需要帮助解决这个问题,谢谢!!!

答案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

编辑标记 # <--

它的工作原理是,它不返回整数值,而是将其回显(写入屏幕)。通常,这会打印到终端,但语法$( ... )会捕获打印的输出,并将其分配给errorin removebook_option()。这允许“返回”任何字符串,我让它NOT_FOUND在未找到时返回一个标记值。

笔记:

  • 数组扩展应该用双引号引起来:"${author[@]}""${title[@]}"
  • 使用[[ ... ]]而不是[ ... ]

相关内容