GNU/Linux >> Linux Esercitazione >  >> Linux

Operatori logici multipli, ((a || B) &&C) e "Errore di sintassi vicino a token imprevisto"?

Sto lavorando con Bash 3 e sto cercando di formare un condizionale. In C/C++, è semplicissimo:((A || B) && C) . In Bash, non è andata così (penso che gli autori di Git debbano aver contribuito con questo codice prima di passare ad altre attività).

Questo non funziona. Nota che <0 or 1> non è una stringa letterale; significa 0 o 1 (generalmente deriva da grep -i ).

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi

Risulta in:

line 322: syntax error near unexpected token `[['

Ho quindi provato:

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi

risulta in:

line 322: syntax error near unexpected token `[['

Parte del problema è che i risultati della ricerca sono gli esempi banali e non gli esempi più complessi con condizionali composti.

Come eseguo un semplice ((A || B) && C) in Bash?

Sono pronto per srotolarlo e ripetere gli stessi comandi in più blocchi:

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>

if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
    ...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
    ... 
fi

Risposta accettata:

La sintassi di bash non è simile al C, anche se una piccola parte è ispirata al C. Non puoi semplicemente provare a scrivere codice C e aspettarti che funzioni.

Il punto principale di una shell è eseguire comandi. Il comando tra parentesi aperte [ è un comando che esegue un singolo test¹. Puoi anche scriverlo come test (senza la parentesi di chiusura finale). Il || e && gli operatori sono operatori di shell, combinano comandi , non test.

Quindi quando scrivi

[ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eq "0" ]

che viene analizzato come

[ [ "$A" -eq "0" ] ||
[ "$B" -ne "0" ] ] &&
[ "$C" -eq "0" ]

che è lo stesso di

test [ "$A" -eq "0" ||
test "$B" -ne "0" ] &&
test "$C" -eq "0"

Notare le parentesi sbilanciate? Sì, non va bene. Il tuo tentativo con le parentesi ha lo stesso problema:parentesi spurie.

La sintassi per raggruppare i comandi è parentesi graffe. Il modo in cui le parentesi graffe vengono analizzate richiede un comando completo prima di esse, quindi dovrai terminare il comando all'interno delle parentesi graffe con una nuova riga o un punto e virgola.

if { [ "$A" -eq "0" ] || [ "$B" -ne "0" ]; } && [ "$C" -eq "0" ]; then …

C'è un modo alternativo che consiste nell'usare le doppie parentesi. A differenza delle parentesi singole, le parentesi doppie sono sintassi della shell speciale. Delimitano le espressioni condizionali. Tra parentesi doppie, puoi usare parentesi e operatori come && e || . Poiché le doppie parentesi sono sintassi della shell, la shell sa che quando questi operatori sono racchiusi tra parentesi quadre, fanno parte della sintassi dell'espressione condizionale, non della normale sintassi dei comandi della shell.

if [[ ($A -eq 0 || $B -ne 0) && $C -eq 0 ]]; then …

Se tutti i tuoi test sono numerici, c'è ancora un altro modo, che delimita le espressioni artimetiche. Le espressioni aritmetiche eseguono calcoli interi con una sintassi molto simile al C.

if (((A == 0 || B != 0) && C == 0)); then …

Potresti trovare utile il mio primer per staffa bash.

Correlati:Debian – Arresto anomalo del sistema – strani caratteri nel syslog?

[ può essere utilizzato in pianura sh. [[ e (( sono specifici per bash (e ksh e zsh).

¹ Può anche combinare più test con operatori booleani, ma questo è ingombrante da usare e presenta sottili insidie, quindi non lo spiegherò.


Linux
  1. Esercitazione sulla programmazione C Linux Parte 11 - Operatori aritmetici, relazionali e logici

  2. Precedenza degli operatori logici della shell &&, ||?

  3. Caricamento di librerie condivise e utilizzo della RAM?

  4. Bash:errore di sintassi vicino a token imprevisto `}'?

  5. "Errore di sintassi vicino a token imprevisto" dopo la modifica di .bashrc?

Come Grep per più stringhe e pattern

Come installare e configurare più motori di scacchi su XBoard

Backup e ripristino di snapshot LVM su Linux

Spiegazione:input, output e reindirizzamento degli errori in Linux

Errore tar:EOF imprevisto nell'archivio

errore di sintassi vicino al token imprevisto ' - bash