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
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?
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.
Tags shell-script