Eu tenho o seguinte if
bloco no meu script bash:
if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
A execução do script não está entrando no meu if
bloco, embora $PACKAGENAME
seja igual a kakadu-v6_4-00902C
. O que estou fazendo errado?
bash
shell-script
test
DemiSheep
fonte
fonte
-eq
é verdadeiro para números inteiros, você quer teste para uma string ou expressão regular (==
ou=~
): mywiki.wooledge.org/BashGuide/TestsAndConditionalsjasonwryan
, vou dar uma olhada neste recurso!Respostas:
-eq
é um operador aritmético, que compara dois números.Use
=
(portátil / padrãosh
)=~
ou , em==
vez disso.Também use aspas, porque se
${PACKAGENAME}
contiver um caractere de espaço em branco ou curinga, ele será dividido em vários argumentos, o que faz com que[
veja mais argumentos que o desejado. Veja aqui uma lista de armadilhas comuns do bash.Veja
man bash
, pesquise ( /) porCONDITIONAL EXPRESSIONS
.fonte
polym
, vou dar uma olhada, obrigado pelo recurso! Vou abrir essa guia ao lado do meu guia VI. :)[[ $PACKAGENAME == "kakadu..." ]]
é aceitável.=
,==
e!=
, por esse lado é um padrão, não uma string. Por exemplo,foo='*'; [[ whatever = $foo ]]
é verdade.Substitua
-eq
por==
para que o seu bloco if seja o seguinte: -fonte
Outra maneira é negá-los:
O bloco acima primeiro testa se
"$PACKAGENAME"
tem algum valor e, se não, sai com erro e ecoa?'this'}
parastderr
. Se o shell pai ainda existir, o teste foi aprovado e o próximo teste se a remoção da string 'kakadu ...' da variável resultar em uma-z
string vazia. Caso contrário, emite novamente um erro e sai do shell. Se o seu shell ainda existir neste momento, qualquer coisa após a execução do bloco, caso contrário, não existe.Provavelmente, esse tipo de coisa é melhor implementado em uma função. Gostar:
Com essa função, você pode fornecer quantos argumentos o seu sistema permitir. Se você fornecer menos de 2, ele retornará 1 e emitirá uma mensagem para
stderr
. Se você fornecer 2 ou mais argumentos, ele tratará todos como seqüências de caracteres e retornará 0 se todos forem idênticos e não nulos; caso contrário, retornará o número do argumento que primeiro falha na verificação.No seu caso, pode ser usado como:
Para demonstrar ainda mais, escreverei outra função:
DEMO:
SAÍDA:
fonte