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 paratest
. (Confiraman [
ouman 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, definido$?
como0
se 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$?
como1
. 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; fi
avalia o comandocondition
e, se retornar um código de saída bem-sucedido, passa a avaliar os comandos embody
.
Vale a pena observar algumas coisas que você pode encontrar:
O
true
utilitário sempre retorna um código de saída bem-sucedido efalse
sempre 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$foo
for 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 argumentoxno thanks
como 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.