/ / Dlaczego test mówi nieoczekiwany nawias? - bash, shell, sh

Dlaczego test mówi nieoczekiwany nawias? - bash, shell, sh

mam if wiersz w moim skrypcie powłoki, który wygląda tak:

if [ 0 -lt 2 -o (0 -gt 3 ) ]

a to daje błąd:

line 3: syntax error near unexpected token `("

Więc popatrzyłem man test aby mieć pewność, że pareny były obsługiwane, a na pewno bardzo blisko górnej strony podręcznika, są! Co daje!?

Powyższy przykład nie zgadza się dokładnie z kodem, ponieważ próbowałem go wyczyścić, aby udowodnić punkt, ale tak jest moje repozytorium jeśli potrzebujesz kontekstu.

EDIT: zmieniono wiersz if, aby dopasować błąd.

Odpowiedzi:

5 dla odpowiedzi № 1

Nawiasy są przekazywane do test dowództwo jako argumenty. The [ ... ] wyrażenie to kolejny sposób na wpisanie test dowództwo. Jedyną różnicą jest to, że ostatni argument za [ polecenie musi być ].

Powinieneś więc uciec z nawiasu, tak jak wszystkie inne argumenty przekazane do polecenia, aby uniknąć interpretacji powłoki:

if [ ( $# -lt 2 ) -o ( $# -gt 3 ) ]

Możesz też użyć pojedynczych cudzysłowów:

if [ "(" $# -lt 2 ")" -o "(" $# -gt 3 ")" ]

Ze strony informacyjnej:

`test"
`["
test EXPR

Evaluate a conditional express ion EXPR and return a status of 0
(true) or 1 (false).  Each operator and operand must be a separate
argument.

Nawiasem mówiąc, wyrażenie może zostać przepisane w następujący sposób:

if builtin test ( $# -lt 2 ) -o ( $# -gt 3 )

3 dla odpowiedzi № 2

Masz niepotrzebne (...) wewnątrz [ ... ] które nie są zmieniane i nie są cytowane, powodując błąd składniowy.

Możesz tego użyć zamiast:

[[ $# -lt 2 || $# -gt 3 ]]

Albo użyj:

[[ $# -lt 2 ]] || [[ $# -gt 3 ]]

3 dla odpowiedzi nr 3

Chociaż to rozwiązanie nie odpowiada bezpośrednio na pytanie, ale tutaj jest alternatywny sposób używania stylu C. wyrażeń arytmetycznych, co jest skuteczne, jeśli masz do czynienia z liczbami w bash

#!/bin/bash

if (( "$#" < 2 || "$#" > 3 )); then