Я новичок в Unix/Linux. Я пытаюсь понять код разработчика до меня. Может кто-нибудь сказать мне, что означает эта строка if [ $# -lt 2 ]
?
решение1
В Bash $#
расширяется до числа установленных позиционных параметров.
if [ $a -lt $b ]
означает, что значение a меньше значения b.
if [ $# -lt 2 ]
означает, что количество установленных позиционных параметров меньше 2.
В рабочем примере вы, возможно, использовали бы это для подсчета параметров, заданных для функции. Если вы определяете функцию как:
count_words(){
if [ $# -lt 2 ]
then
echo "There are less than two words."
else
echo "There are 2 or more words."
fi
}
Затем вызовите функцию с разным количеством слов, результаты будут следующими:
$ 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.
решение2
Это композиция из трех вещей:
$#
— это переменная оболочки, которая содержит количество позиционных аргументов скрипта или функции.[
это не специальный синтаксис, а скорее имя программы — псевдоним дляtest
. (Проверьтеman [
илиman test
.)Командная строка
[
анализируется как выражение:[ $# -lt 2 ]
вызывается[
с аргументами$#
,-lt
,2
, и]
(что является просто визуальным разделителем). Он возвращает успешный код выхода, устанавливая$?
в0
, если выражение оценивается как истинное (т.е. если число аргументов скрипта меньше 2), или неудачный код выхода в противном случае, устанавливая$?
в1
. Вы можете увидеть это, введя:[ 1 -lt 2 ]; echo $? # 1 < 2 is true: 0 [ 2 -lt 1 ]; echo $? # 2 < 1 is false: 1
if condition; then body; fi
оценивает командуcondition
и, если она возвращает успешный код завершения, переходит к оценке команд вbody
.
Стоит отметить некоторые вещи, с которыми вы можете столкнуться:
Утилита
true
всегда возвращает успешный код завершения иfalse
всегда возвращает код ошибки, поэтому вы можете использовать их в условиях, например:while true; do … done
if [ $foo = "yes" ]
не будет работать, если$foo
расширяется до пустой строки ([ = yes ]
) или до строки, содержащей пробелы ([ no thanks = yes ]
). Поэтому вы часто будете видеть:if [ "x$foo" = "xyes" ]
Таким образом, он
[
получает единственный аргументxno thanks
в качестве первого операнда=
.[[
…]]
это оболочкаключевое слово(невстроенный), со специальными правилами синтаксического анализа для устранения вышеуказанного ограничения, и которые могут предоставлять дополнительные возможности.