¿Qué significa si [ $# -lt 2 ]?

¿Qué significa si [ $# -lt 2 ]?

Soy nuevo en Unix/Linux. Estoy tratando de entender el código del desarrollador que tengo delante. ¿Alguien puede decirme qué significa esta línea if [ $# -lt 2 ]?

Respuesta1

En Bash $#se expande al número de parámetros posicionales que se han establecido.

if [ $a -lt $b ]significa si el valor de a es menor que el valor de b.

if [ $# -lt 2 ]significa que el número de parámetros posicionales establecidos es inferior a 2.

En un ejemplo práctico, quizás usarías esto para contar los parámetros dados a una función. Si define una función como:

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

Luego llame a la función con diferentes números de palabras, los resultados serían los siguientes:

$ 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.

Respuesta2

Esta es una composición de tres cosas:

  • $#es una variable de shell que contiene el número de argumentos posicionales de un script o función.

  • [no es una sintaxis especial, sino más bien el nombre de un programa; es un alias de test. (Consulta man [o man test.)

    La línea de comando de [se analiza como una expresión: [ $# -lt 2 ]está llamando [con los argumentos ,, $#y ( que es solo un delimitador visual). Devuelve un código de salida exitoso, estableciéndose en si la expresión se evalúa como verdadera (es decir, si el número de argumentos del script es menor que 2) o un código de salida fallido en caso contrario, estableciéndose en . Puedes ver esto ingresando:-lt2]$?0$?1

    [ 1 -lt 2 ]; echo $?    # 1 < 2 is true: 0
    [ 2 -lt 1 ]; echo $?    # 2 < 1 is false: 1
    
  • if condition; then body; fievalúa el comando conditiony, si devuelve un código de salida exitoso, procede a evaluar los comandos en body.

Vale la pena señalar algunas cosas que puede encontrar:

  • La trueutilidad siempre devuelve un código de salida exitoso y falsesiempre devuelve un error, por lo que puede usarlos en condiciones, por ejemplo:

    while true; do
    done
    
  • if [ $foo = "yes" ]no funcionará si $foose expande a la cadena vacía ( [ = yes ]) o a una cadena que contiene espacios ( [ no thanks = yes ]). Por lo tanto, verás a menudo:

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

    De modo que [recibe un único argumento xno thankscomo primer operando de =.

  • [[... ]]es un caparazónpalabra clave(No unincorporado), con reglas de análisis especiales para abordar la limitación anterior y que pueden proporcionar características adicionales.

información relacionada