Odpowiedzi:
Po pierwsze [ polecenie wykonuje tylko porównania. Musisz wykonać obliczenia oddzielnie. Na przykład:
var1mod=$((var1 % 2))
if [ $var1mod -eq 0 ]; then
Ponieważ jednak wydajesz się pisać skrypt do basha, możesz użyć innego polecenia i uniknąć dodatkowego kroku:
if (( var1 % 2 == 0 )); then
Po drugie, nie można łączyć poleceń za pomocą -a. To działa tylko jako argument [. Ale poza tym musisz użyć &&.
Trzy różne warianty:
if [ $var1mod -eq 0 -a $var2mod -eq 0 ]; then
if [ $var1mod -eq 0 ] && [ $var2mod -eq 0 ]; then
if (( var1 % 2 == 0 )) && (( var2 % 2 == 0 )); then
if (( var1 % 2 == 0 && var2 % 2 == 0 )); then
Zawsze pamiętaj, składnia if jest prosty if dowództwo ; następnie dowództwo ; fi . To znaczy że [ w if [ to tylko nazwa polecenia ls lub echo.
Wydaje się, że mylicie ewaluację warunkową z oceną arytmetyczną. % jest operatorem w ocenie arytmetycznej, a nie warunkowej. Zobacz bash(1) sekcje strony dla tych tematów. [...] jest do oceny warunkowej, podczas gdy ((...)) służy do oceny arytmetycznej.
Nie wspominając o tym, że Twoja linia shebang jest błędna, chyba że z jakiegoś powodu zainstalowałeś kopię basha na poziomie głównym dysku rozruchowego.
Wreszcie, nowa linia jest taka sama jak średnik. Nie musisz kończyć linii średnikiem w skryptach powłoki. Średnik po prostu istnieje, aby umożliwić umieszczenie dwóch instrukcji w jednym wierszu.
Oto wyczyszczona wersja skryptu:
#!/bin/bash
VAR1=10
VAR2=20
if (( (VAR1 % 2 == 0) && (VAR2 % 5 == 0) )); then
: #something (colon is a no-op)
fi
-a ma dwa znaczenia; EXPR -a EXPR jest logiczne AND.
%i%5są uzasadnionymi argumentami[?