Jaki jest błąd w instrukcji if w tym skrypcie bash?

0

Jaki jest problem z następującym skryptem powłoki? Otrzymuję

[: too many arguments

błąd

#!/bash
var1=10;
var2=20;
if [ $var1 % 2 -eq 0 ] -a [ $var2 %5 -eq 0 ];
then
    #something
fi
Pradeep
źródło
1
Dlaczego w to wierzysz? % i %5 są uzasadnionymi argumentami [?
Ignacio Vazquez-Abrams
jak zdobyć modularny (jestem nowicjuszem)
Pradeep

Odpowiedzi:

5

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.

grawity
źródło
2

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
Spiff
źródło
-a ma dwa znaczenia; EXPR -a EXPR jest logiczne AND.
grawity