Script de shell Se erro de sintaxe

1
if ($(ipcs|grep test|wc -l)=630); then

echo "Shared Memory check passed"
fi

Eu recebo abaixo do erro:

./Test1: line 25: 636=630: command not found
    
por canonical 24.08.2015 / 20:59

3 respostas

7

Alguns erros de sintaxe

A base para as construções 'if' no bash é esta:

if [ expression ];
then
    # code if 'expression' is true.
fi

aqui está a versão corrigida

if [ "$(ipcs|grep test|wc -l)" -eq 630 ]; then 
    echo "Shared Memory check passed"
fi

ou com [[…]] para impedir a divisão de palavras de valores de variáveis sem duplicação de aspas

if [[ $(ipcs|grep test|wc -l) -eq 630 ]]; then 
    echo "Shared Memory check passed"
fi

ou melhor

if [[ $(ipcs|grep -c test) -eq 630 ]]; then 
    echo "Shared Memory check passed"
fi
    
por A.B. 24.08.2015 / 21:17
6

Essencialmente, existem várias maneiras de construir if condicionais em bash ; um é descrito na resposta do A.B. outro, que provavelmente é o que você está tentando usar, envolve o uso de parênteses duplos, que é uma maneira de manipular expressões / variáveis em bash de uma maneira mais estilo C e que, por definição, requer parênteses duplos para trabalhar (lembre-se de que isso não funcionará, por exemplo, para comparações de strings):

if (($(ipcs|grep test|wc -l)==630)); then
    echo "Shared Memory check passed"
fi

Mais informações sobre "The Double-Parentheses Construct"

    
por kos 24.08.2015 / 22:05
3

Para adicionar outra opção: você pode eliminar colchetes e parênteses usando o test incorporado:

if test $(ipcs|grep test|wc -l) -eq 630; then 
    echo "Shared Memory check passed"
fi

O [ integrado é essencialmente um alias para o test interno, exceto pelo fato de que é necessário um argumento adicional: ] .

Isso também ilustra que o [ não faz parte da instrução if . Os [ e binário /usr/bin/[ incorporados são apenas comandos como qualquer outro, por ex. ls ou grep .

A instrução if executa o (s) comando (s) entre o if e o then . Se o último tiver o código de saída 0 , ele executará os comandos seguindo o then . O comando [ sai com 0 se seus argumentos - que ele interpreta como uma expressão lógica de acordo com certas regras de sintaxe - forem avaliados como verdadeiros.

Na verdade, você pode eliminar o if e usar somente o comando [ , como no idiomático:

[ $(ipcs|grep test|wc -l) -ne 630 ] || echo "..."
    
por zwets 24.08.2015 / 23:36