incontro “operatore unario previsto” in bash script

nel mio script bash, ho una funzione restituisce 0 o 1(true o false) per la successiva funzione principale della condizione.

function1 () { 
    if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then
        return 1
    else
        return 0
    fi 
}

poi nella mia funzione principale:

main () { 
    for arg in ${@} ; do
        if [ function1 ${arg} ] ; then
            ...
        elif [ ... ] ; then
            ...
        fi
    done
}

tuttavia, quando ho eseguito questo script mi ha sempre dato un messaggio di errore “[: funzione1: operatore unario previsto”

qualcuno mi può aiutare per favore?

  • Si noti che, almeno in bash, versione 4, non si deve citare l’espressione regolare: facendo così le forze di semplice corrispondenza della stringa — documentato qui. Inoltre, si dovrebbe utilizzare for arg in "[email protected]" con le virgolette, o più semplice for arg; do ...
  • Si dovrebbe mettere il vostro regex in una variabile. pattern='^ ...some regexp... $'; if [[ $1 =~ $pattern ]]. Si noti che all’interno di doppie parentesi quadre, non è necessario citare le variabili e come glenn ha detto, la regex (variabile) non deve mai essere citato.
InformationsquelleAutor GJ. | 2012-05-14

 

One Reply
  1. 29

    Si stanno facendo i comuni di errore di supponendo che [ è parte del if comando della sintassi. Non è; la sintassi di if è semplicemente

    if command; then
        ... things which should happen if command's result code was 0
    else
        ... things which should happen otherwise
    fi

    Uno dei comuni commands utilizziamo è [ che è un alias per il comando test. Si tratta di un semplice comando per il confronto di stringhe, numeri e file. Si accetta un abbastanza stretta combinazione di argomenti, e tende a generare confusione e fuorvianti messaggi di errore se non si passa il previsto argomenti. (O meglio, i messaggi di errore sono adeguate e utili, una volta che ci si abitua ad esso, ma sono facilmente frainteso se non sei abituato.)

    Nel main funzione, chiamata a [ appare fuori luogo.  probabilmente significa

    if function "$arg"; then
        ...
    elif ... ; then ...

    Dal modo in cui, per buona misura, si dovrebbe anche citare sempre le tue corde. Utilizzare "$1" non $1, e "$arg" invece di $arg.

    Le ragioni storiche per test generale del lavandino di cucina della roba che gli autori non vogliono fare parte della sintassi del if è uno dei meno attraenti disegni originali Bourne shell. Bash e zsh offrire alternative che sono meno ingombrante (come il [[ doppie parentesi quadre in bash, che si utilizza nella vostra function1 definizione), e, naturalmente, POSIX test è molto più ben temperato di creazione originale da Bell Labs.

    Come un ulteriore chiarimento, la funzione può essere semplificata per soli

    function1 () {
        ! [[ "$1" =~ "^ ...some regexp... $" ]]
    }

    Che è, eseguire il test con [[ e invertire il codice di risultato. (Il caso “normale” sarebbe quello di tornare a 0 per il successo, ma forse si sta tentando di verificare che la stringa non corrisponde?)

    • quelli che … rappresentano script dopo ${1}, e nel mio script ho accuratamente diviso il mio script e staffe con uno spazio. quindi non credo che è il problema che
    • no, la mia funzione 1 in realtà controlla se $1 è la corrispondenza di un qualche tipo di espressione regolare. e la mia funzione 1 solo funziona bene in piedi da solo. quindi quello che penso è che c’è qualche problema con la condizione nella mia funzione principale
    • Oh, mi dispiace, perse l’errore in main. Grazie per il suggerimento. L’analisi di base contiene ancora; [ non è quello che pensi tu.
    • Grazie! si consiglia di non utilizzare le parentesi dentro le mie condizioni di main. grazie!
    • Ho riproposto questa risposta stackoverflow.com/a/36371520/874188, che è più concentrato domanda. Se si sono stati collegati qui, forse, fare clic su attraverso la più recente domanda.

Lascia un commento