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%5
są uzasadnionymi argumentami[
?