Что означает if [ $# -lt 2 ]?

Что означает if [ $# -lt 2 ]?

Я новичок в 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в качестве первого операнда =.

  • [[]]это оболочкаключевое слово(невстроенный), со специальными правилами синтаксического анализа для устранения вышеуказанного ограничения, и которые могут предоставлять дополнительные возможности.

Связанный контент