erro de script de shell estranho: retorno de opção inválido: usage: return [n]

0

Este programa verifica se existe um determinado título do livro, combinando a entrada do usuário do título do livro e do autor do livro.

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

Estou recebendo um erro muito estranho, em que function checkexist() retorna 2 em vez de -1 quando não existe uma correspondência que ocorre ao retornar o valor error=-1

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

EDIT: Por razões desconhecidas, só posso retornar valores de 0-255, alguém sabe como retornar valores negativos ??

Você pode tentar inserir dados incorretos para ver o erro estranho

Preciso de ajuda para resolver este problema, obrigado !!!!

    
por Computernerd 10.01.2014 / 10:46

1 resposta

1

Você está recebendo este erro:

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

Isso ocorre porque o -1 é interpretado como uma opção. Use isso, -- significa 'fim de opções':

return -- -1

que retorna com 255 .

Solução de trabalho:

#!/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

Edições marcadas com  # <--

Isso funciona ao invés de retornar um valor inteiro, ecoa (escreve na tela). Geralmente, isso seria impresso no terminal, mas a sintaxe $( ... ) captura a saída impressa e a atribui a error in removebook_option() . Isso permite 'retornar' qualquer string, eu fiz isso retornar um valor sentinela de NOT_FOUND se não for encontrado.

Notas:

  • A expansão da matriz deve ser agrupada com aspas duplas: "${author[@]}" e "${title[@]}"
  • Use [[ ... ]] em vez de [ ... ] .
por kiri 10.01.2014 / 11:34