Próbuję napisać skrypt, który będzie sprawdzał dwie flagi błędów i w przypadku zmiany jednej flagi (lub obu) pojawi się echo - wystąpił błąd. Mój skrypt:
my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then
echo "$my_error_flag"
else
echo "no flag"
fi
Zasadniczo powinno być coś w tym:
if ((a=1 or b=2) or (a=1 and b=2))
then
display error
else
no error
fi
Otrzymuję błąd:
line 26: conditional binary operator expected
line 26: syntax error near `]'
line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'
Czy moje nawiasy są pomieszane?
bash
if-statement
flags
Po prostu ja
źródło
źródło
a==1 or b==2
obejmuje już przypadek, w któryma==1 and b==2
. Testowanie osobno jest tutaj całkowicie zbędne.Odpowiedzi:
Użyj
-a
(dla i) i-o
(dla lub) operacji.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
Aktualizacja
Właściwie można nadal korzystać
&&
i||
przy-eq
pracy. Więc twój skrypt wyglądałby tak:Chociaż w twoim przypadku możesz odrzucić ostatnie dwa wyrażenia i po prostu trzymać się jednego lub takiej operacji:
źródło
[
i]
do grupowania (nie robią tego) i nieumieszczanie spacji wokół operatora (np."$my_error_flag"="1"
), Co uniemożliwia powłoce rozpoznanie go jako operatora w ogóle. Przeczytaj BashFAQ # 17 (na temat grupowania) i # 31 (na temat różnicy między różnymi typami wyrażeń testowych) . Właściwie w tym przypadku byłoby jeszcze łatwiej użyć wyrażenia arytmetycznego .-a
i-o
są uważane za przestarzałe w specyfikacji POSIX ; użyj oddzielnych testów połączonych z||
jak w aktualizacji.{}
powinno być również możliwe.Możesz użyć słowa kluczowego
[[
lub((
. Gdy używasz[[
słów kluczowych, masz operatorom korzystanie strunowych, takich jak-eq
,-lt
. Myślę, że((
jest najbardziej preferowany do arytmetyki, ponieważ możesz bezpośrednio używać operatorów, takich jak==
,<
i>
.Korzystanie
[[
operatorKorzystanie
((
operatorNie używaj
-a
ani-o
operatorów, ponieważ nie jest przenośny.źródło
Spróbuj śledzić
źródło
( ... )
tworzy podpowłoki - duży wpływ na wydajność bez żadnych korzyści.{ ...; }
do grupowania bez tworzenia podpowłoki.Możesz czerpać inspirację, czytając
entrypoint.sh
skrypt napisany przez autorów z MySQL, który sprawdza, czy określone zmienne zostały ustawione.Jak pokazuje skrypt, możesz je potokować
-a
np .:źródło
-a
jest oznaczony jako przestarzały w aktualnej wersjitest
standardu POSIX ; zobaczOB
znaczniki na pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html . Użyj,[ -z "$FOO" ] && [ -z "$BAR" ]
aby uzyskać bardziej niezawodny kod.