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 detest
. (Consultaman [
oman 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:-lt
2
]
$?
0
$?
1
[ 1 -lt 2 ]; echo $? # 1 < 2 is true: 0 [ 2 -lt 1 ]; echo $? # 2 < 1 is false: 1
if condition; then body; fi
evalúa el comandocondition
y, si devuelve un código de salida exitoso, procede a evaluar los comandos enbody
.
Vale la pena señalar algunas cosas que puede encontrar:
La
true
utilidad siempre devuelve un código de salida exitoso yfalse
siempre devuelve un error, por lo que puede usarlos en condiciones, por ejemplo:while true; do … done
if [ $foo = "yes" ]
no funcionará si$foo
se 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 argumentoxno thanks
como 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.