O que esses comandos significam?

2

Qual seria uma maneira mais direta e legível desses comandos?

E por que exit 255 e não exit 1 ?

[ $# -eq 3 ] || { echo error ; exit 255 ; }

grep -q "string" && exit 0
    
por Sandra Schlichting 15.02.2012 / 16:35

5 respostas

5

Outros já mencionaram que $# é o número de argumentos da linha de comando, então vou ignorar essa parte da sua pergunta.

Com cmd1 && cmd2 , o shell executa primeiro cmd1 . Se cmd1 falhar, a expressão inteira falhará. Se cmd1 for bem-sucedido, o shell continuará executando cmd2 . A expressão inteira é bem-sucedida se ambos cmd1 e cmd2 forem bem-sucedidos. Portanto, o operador && é o booleano de curto-circuito AND aplicado aos comandos do shell. As utilizações deste operador podem ser substituídas por

if cmd1
then
    cmd2
fi

Com cmd1 || cmd2 , o shell executa primeiro cmd1 . Se for bem sucedido, toda a expressão é bem sucedida. Caso contrário, o shell executará cmd2 e o sucesso ou a falha da expressão será determinada por cmd2 . Em suma, este é o booleano de curto-circuito OU aplicado aos comandos do shell. Você pode substituir este formulário por

if ! cmd1
then
    cmd2
fi

Eu usei com cuidado as frases sucedidas / sucedidas e com falha / falhar acima. Sucesso, para comandos de shell, é definido como um status de saída do processo de zero. Falha é qualquer status diferente de zero. No entanto, tentar entender os operadores && e || em termos de status de saída é, pelo menos para mim, confuso, já que você acaba com um tipo estranho de lógica invertida.

    
por 15.02.2012 / 17:02
3

Isso é muito direto, na verdade.

O script verifica se ele obtém exatamente 3 parâmetros, isso é a parte [ $# -eq 3 ] . Caso contrário, a parte { echo error ; exit 255 ; } será executada. O código de saída 255 tem um significado especial, significa "Sair do status fora do intervalo" veja aqui. Eu acho que é um pouco mal aplicado aqui, mas é possível.

    
por 15.02.2012 / 16:44
2

$ # é o número de argumentos para o shell. Então, a primeira linha diz "sair se não houver 3 argumentos", porque a parte direita (após o || ) é executada apenas se a parte esquerda não for verdadeira. || é a lógica ou .

255 como um código de retorno pode ser arbitrário.

os scripts retornarão 0 , se a palavra "string" estiver na entrada.

Isso ajuda?

    
por 15.02.2012 / 16:37
1

Em um lado do operador ou você tem a função test ([), se esta for avaliada como true (que será quando $ # é igual a três) então nós nem precisamos nos preocupar em checar o outro lado. Se for falso, temos que tentar o outro lado, que neste caso é uma função para ecoar um erro e depois sair. A mesma funcionalidade pode ser obtida com um script mais detalhado:

if [ $# -ne 3 ]
then
  echo error
  exit 255
fi
    
por 15.02.2012 / 16:44
1

A linha com o comando grep faz exit 0 se "string" estiver na entrada, caso contrário, o código de saída será 1. Uma maneira mais explícita seria:

grep -q "string"
if [ $? -eq 0 ]
then
  exit 0
else
  exit 1
fi
    
por 15.02.2012 / 16:54

Tags