Qual é o erro na declaração if neste script bash?

0

Qual é o problema com o seguinte script de shell? Estou recebendo

[: too many arguments

erro

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

2 respostas

5

Primeiro, o comando [ só faz comparações. Você tem que realizar cálculos separadamente. Por exemplo:

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

No entanto, uma vez que você parece estar escrevendo seu script para o bash, você pode usar um comando diferente e evitar a etapa extra:

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

E segundo, você não pode encadear comandos com -a . Isso funciona apenas como um argumento para [ . Mas fora dela, você deve usar && .

Três variantes diferentes:

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

Lembre-se sempre de que a sintaxe de if é um simples if command; then command; fi . Isso significa que [ in if [ é apenas o nome de um comando como ls ou echo .

    
por 06.01.2012 / 09:15
2

Você parece confundir Avaliação Condicional com Avaliação Aritmética. % é um operador em Avaliação Aritmética, não em Avaliação Condicional. Veja as seções da página bash(1) man para esses tópicos. [...] é para avaliação condicional, enquanto ((...)) é para avaliação aritmética.

Sem mencionar que sua linha shebang está errada, a menos que, por algum motivo, você tenha instalado uma cópia do bash no nível raiz da sua unidade de inicialização.

Por último, mas não menos importante, uma nova linha é o mesmo que um ponto e vírgula. Você não precisa terminar uma linha com um ponto-e-vírgula no shell script. O ponto-e-vírgula existe apenas para permitir que você coloque duas instruções em uma linha.

Aqui está uma versão limpa do seu script:

#!/bin/bash

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

Tags