Não conseguindo fazer o operador AND trabalhar no script bash

1

Estou tentando criar um script bash bastante simples, no qual, se a entrada for "on 1", executará uma ação e, se estiver "on 2", executará outra ação. Eu pesquisei um pouco sobre como as pessoas faziam o trabalho do operador nos scripts do bash, encontrei muitas maneiras diferentes e nenhuma delas funcionou, até que descobri que substituir meus colchetes [] por parênteses () .

#!/bin/sh
#

if (($1=="on" && $2=="1")); then
    echo $1 $2
else
    echo failure
fi

Uma vez que cheguei tão longe, o que acontece é que meu script está aceitando o segundo argumento, mas não o primeiro. Então, se eu escrever "off 1", o script será executado mesmo que $ 1 não esteja "ligado" como o if deve ser exigente, no entanto, se eu escrever "on 2", o código pula para minha declaração else.

Como faço para ler os dois argumentos corretamente em vez de apenas o segundo?

    
por Cestarian 11.02.2015 / 20:19

2 respostas

2

Você pode tentar isso, conforme mencionado nos comentários, mas observe os espaços.

#!/bin/bash


if [[ "$1" == "on" && $2 -eq 1 ]]; then
    echo $1 $2
else
    echo failure
fi
    
por 11.02.2015 / 20:36
3

Os parênteses duplos são para operações numéricas; colchetes [] agem como contextos booleanos. Os colchetes duplos não são portáteis, e falharão em dash e outras camadas muito mínimas. Na realidade, [ é um utilitário shell builtin / POSIX que executa operações lógicas, e é por isso que você precisa de espaços ao seu redor. Este link tem muito mais detalhes sobre o assunto, se você estiver curioso.

Se eu fosse escrever isso, seria mais parecido com isto:

#!/bin/sh

# check we got the expected number of arguments
if [ "$#" -ne 2 ]; then
  echo USAGE ...
  exit
fi

if [ "x$1" = "xon" ] && [ "$2" -eq 1 ]; then
  echo "$1 $2"
else
  echo failure
fi

A concatenação "x" é uma boa prática para impedir que strings vazias descarrilem seu programa.

    
por 11.02.2015 / 20:48