non usare mai l'operatore `-a` o` -o` con `[`


11

Stéphane Chazelas ha scritto:

alcune regole simili

  • cita sempre le variabili
  • non usare mai l' operatore -ao -o(usare diversi [comandi e gli operatori &&e ||shell)

Fare [affidabile con conchiglie POSIX.

Perché "non usare mai l' operatore -ao -o"?

Come posso fare "usare diversi [comandi e gli operatori &&e ||shell)"?

Risposte:


13

Perché "non usare mai l' operatore -ao -o"?

Perché potrebbero essere ambigui e quindi non conformi a POSIX :

Le estensioni XSI che specificano le primarie binarie -a e -o e gli operatori '(' e ')' sono state contrassegnate come obsolete. (Molte espressioni che le usano sono definite in modo ambiguo dalla grammatica a seconda delle espressioni specifiche che vengono valutate.) Gli script che usano queste espressioni devono essere convertiti nei moduli indicati di seguito. Anche se molte implementazioni continueranno a supportare queste forme obsolete, gli script dovrebbero essere estremamente attenti quando si tratta di input forniti dall'utente che potrebbero essere confusi con questi e altri primari e operatori. A meno che lo sviluppatore dell'applicazione non conosca tutti i casi che producono input per lo script, invocazioni come:

test "$1" -a "$2"

dovrebbe essere scritto come:

test "$1" && test "$2"

Come posso fare "usare diversi [comandi e gli operatori &&e ||shell)"?

Effettuando più test e concatenandoli utilizzando detti operatori; per esempio:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

potrebbe essere riscritto come equivalente:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

o meglio:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }

Grazie. (1) "gli operatori '(' e ')' sono stati contrassegnati obsolescenti". Sono (e )gli operatori che raggruppano i comandi? Se sono obsoleti, quali sono i loro sostituti? (2) Dovrebbe test "$1" -a "$2"essere sostituito da test "$1" && test "$2"o da ((test "$1" && test "$2"))? Non abbiamo bisogno del ((..))?
Tim

@Tim Vedi l'aggiornamento. (1) Sì: è possibile utilizzare ()e {}in sostituzione. (2) Il primo; (())viene utilizzato per l'espansione aritmetica, qui si desidera testare lo stato di uscita della catena di test, quindi raggruppare i test in una subshell ()o nella shell corrente {}.
kos

Grazie. Penso che le mie domande possano andare oltre questo post. Quindi li inserisco in un nuovo post.
Tim

1
@Tim L'unico motivo per usare gli operatori (e )è quando stai usando -ao -o. Poiché i secondi sono obsoleti, i primi ovviamente non sono più necessari.
Barmar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.