2012-05-14 14 views
12

nel mio script bash, ho una funzione per restituire 0 o 1 (vero o falso) per le condizioni della funzione principale successiva.incontro "operatore unario previsto" nello script bash

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 
} 

però, quando mi sono imbattuto questo script è sempre mi ha dato un msg di errore "[: function1: operatore unario previsto"

può chiunque aiuto io per favore?

+1

Nota che, almeno in bash versione 4, non devi citare l'espressione regolare : così facendo forza la semplice corrispondenza delle stringhe - [documentato qui] (http://www.gnu.org/software/bash/manual/bashref.html#index-g_t_005b_005b-57). Inoltre, dovresti usare 'for arg in" $ @ "' con le virgolette, o più semplice 'per arg; do ... ' –

+1

Dovresti mettere la tua regex in una variabile. 'pattern = '^ ... some regexp ... $'; se [[$ 1 = ~ $ pattern]] '. Si noti che all'interno di parentesi quadre quadrate, non è necessario citare le variabili e, come detto glenn, la regex (variabile) non dovrebbe mai essere citata. –

risposta

28

Si sta commettendo l'errore comune di supporre che [ sia parte della sintassi del comando if. 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 command s che usiamo è [ che è un alias per il comando test. È un semplice comando per confrontare stringhe, numeri e file. Accetta una combinazione piuttosto ristretta di argomenti e tende a generare messaggi di errore confusi e fuorvianti se non si passano gli argomenti previsti. (O meglio, i messaggi di errore sono adeguati e utili una volta che ci si abitua, ma sono facilmente fraintesi se non si è abituati.)

Nella tua funzione main, la chiamata a [ appare in modo errato. Probabilmente vuoi dire

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

A proposito, per buona misura dovresti sempre citare le tue corde. Utilizzare "$1" non $1 e "$arg" anziché $arg.

Le ragioni storiche per test come un lavandino della cucina in generale di cose gli autori non vogliono fare parte della sintassi di if è uno dei disegni meno attraenti del guscio originale Bourne. Bash e zsh offrono alternative meno ingombranti (come le parentesi doppie [[ in bash, che si utilizzano nella definizione function1) e, naturalmente, POSIX test è molto più armonioso rispetto alla creazione originale di Bell Labs.

Come ulteriore chiarimento, la funzione può essere semplificata a poco

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

Cioè, eseguire il test con [[ e invertire il suo codice risultato. (Il caso "normale" sarebbe quello di restituire 0 per il successo, ma forse stai tentando di verificare che la stringa non corrisponde?)

+0

quelli ... rappresentano uno script dopo $ {1} e nel mio script effettivo ho diviso attentamente il mio script e le parentesi con uno spazio. quindi non penso che sia il problema con quello –

+0

no, la mia funzione 1 in realtà controlla se quel $ 1 corrisponde a qualche tipo di espressione regolare.e la mia funzione 1 funziona bene solo da solo. quindi quello che penso è che ci sia qualche problema con la condizione nella mia funzione principale –

+0

Oh, mi dispiace, ho perso l'errore in 'main'. Grazie per il suggerimento. L'analisi di base è ancora valida; '[' non è quello che pensi che sia. – tripleee

Problemi correlati