O que significa se [$# -lt 2]?

O que significa se [$# -lt 2]?

Eu sou novo no Unix/Linux. Estou tentando entender o código do desenvolvedor antes de mim. Alguém pode me dizer o que significa esta linha if [ $# -lt 2 ]?

Responder1

No Bash $#expande para o número de parâmetros posicionais que foram definidos.

if [ $a -lt $b ]significa que se o valor de a for menor que o valor de b.

if [ $# -lt 2 ]significa que o número de parâmetros posicionais definidos é menor que 2.

Em um exemplo prático, você talvez usaria isso para contar os parâmetros dados a uma função. Se você definir uma função como:

count_words(){
  if [ $# -lt 2 ]
  then
    echo "There are less than two words."
  else
    echo "There are 2 or more words."
  fi
}

Em seguida, chame a função com diferentes números de palavras, os resultados seriam os seguintes:

$ count_words hello
There are less than two words.

$ count_words how many words
There are two or more words.

$ count_words
There are less than two words.

$ count_words two words
There are two or more words.

Responder2

Esta é uma composição de três coisas:

  • $#é uma variável shell que contém o número de argumentos posicionais para um script ou função.

  • [não é uma sintaxe especial, mas sim o nome de um programa – é um apelido para test. (Confira man [ou man test.)

    A linha de comando de [é analisada como uma expressão: [ $# -lt 2 ]está chamando [com os argumentos $#, -lt, 2e ](que é apenas um delimitador visual). Ele retorna um código de saída bem-sucedido, definido $?como 0se a expressão for avaliada como verdadeira (ou seja, se o número de argumentos do script for menor que 2) ou um código de saída com falha, caso contrário, definido $?como 1. Você pode ver isso digitando:

    [ 1 -lt 2 ]; echo $?    # 1 < 2 is true: 0
    [ 2 -lt 1 ]; echo $?    # 2 < 1 is false: 1
    
  • if condition; then body; fiavalia o comando conditione, se retornar um código de saída bem-sucedido, passa a avaliar os comandos em body.

Vale a pena observar algumas coisas que você pode encontrar:

  • O trueutilitário sempre retorna um código de saída bem-sucedido e falsesempre retorna uma falha, para que você possa usá-los em condições, por exemplo:

    while true; do
    done
    
  • if [ $foo = "yes" ]não funcionará se $foofor expandido para uma string vazia ( [ = yes ]) ou para uma string contendo espaços ( [ no thanks = yes ]). Portanto, você verá frequentemente:

    if [ "x$foo" = "xyes" ]
    

    Então isso [recebe um único argumento xno thankscomo o primeiro operando de =.

  • [[]]é uma conchapalavra-chave(não umconstruídas em), com regras de análise especiais para resolver a limitação acima e que podem fornecer recursos adicionais.

informação relacionada