Qual è l'errore nell'istruzione if in questo script bash?


0

Qual è il problema con il seguente script di shell? Sto arrivando

[: too many arguments

errore

#!/bash
var1=10;
var2=20;
if [ $var1 % 2 -eq 0 ] -a [ $var2 %5 -eq 0 ];
then
    #something
fi

1
Perché ci credi % e %5 sono argomenti validi per [?
Ignacio Vazquez-Abrams

come otteniamo il modulo (io sono un novizio)
Pradeep

Risposte:


5

Prima il [ comando fa solo confronti. Devi eseguire calcoli separatamente. Per esempio:

var1mod=$((var1 % 2))
if [ $var1mod -eq 0 ]; then

Tuttavia, dal momento che sembra che tu stia scrivendo il tuo script per bash, puoi usare un comando diverso ed evitare il passaggio aggiuntivo:

if (( var1 % 2 == 0 )); then

E in secondo luogo, non puoi concatenare i comandi con -a. Questo funziona solo come un argomento [. Ma fuori di esso, devi usare &&.

Tre diverse varianti:

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

Ricorda sempre, la sintassi di if è un semplice if comando ; poi comando ; fi . Ciò significa che [ nel if [ è solo il nome di un comando come ls o echo.


2

Sembra che tu stia confondendo la valutazione condizionale con la valutazione aritmetica. % è un operatore nella valutazione aritmetica, non nella valutazione condizionale. Vedere il bash(1) sezioni della pagina man per questi argomenti. [...] è per valutazione condizionale, mentre ((...)) è per la valutazione aritmetica.

Per non parlare del fatto che la tua riga di shebang è sbagliata, a meno che per qualche ragione tu abbia installato una copia di bash al livello di root del tuo disco di avvio.

Ultimo ma non meno importante, una nuova riga è uguale a un punto e virgola. Non è necessario terminare una riga con un punto e virgola nello scripting della shell. Il punto e virgola esiste solo per consentire di inserire due istruzioni su una riga.

Ecco una versione ripulita del tuo script:

#!/bin/bash

VAR1=10
VAR2=20
if (( (VAR1 % 2 == 0) && (VAR2 % 5 == 0) )); then
    : #something (colon is a no-op)
fi

-a ha due significati; EXPR -a EXPR è un AND logico.
grawity
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.