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 № 1Nawiasy 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