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

6

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

    
por Aditi678 01.09.2016 / 17:29

2 respostas

11

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

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

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

Em um exemplo de trabalho, 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.
    
por Arronical 01.09.2016 / 17:32
2

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

  • $# é uma variável do 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 alias 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 , 2 e ] (que é apenas um delimitador visual ). Ele retorna um código de saída bem-sucedido, configurando $? para 0 se a expressão for avaliada como verdadeira (ou seja, se o número de argumentos para o script for menor que 2) ou um código de saída com falha, configurando $? to% código%. Você pode ver isso digitando:

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

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

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

    while true; do
      …
    done
    
  • false não funcionará se if [ $foo = "yes" ] expandir para a string vazia ( $foo ) ou para uma string que contenha espaços ( [ = yes ] ). Portanto, muitas vezes você verá:

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

    Para que [ no thanks = yes ] receba um único argumento [ como o primeiro operando de xno thanks .

  • =[[ é uma palavra-chave shell (não um builtin ), com regras especiais de análise para abordar a limitação acima, e que pode fornecer recursos adicionais.

por Jon Purdy 02.09.2016 / 02:38

Tags