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

Я новичок в Unix/Linux. Я пытаюсь понять код разработчика, который был до меня. Кто-нибудь может мне сказать, что означает эта строка if [ $# -lt 2 ]?

6
задан 2 September 2016 в 17:35

2 ответа

В Bash $# расширяется до количества позиционных параметров, которые были установлены.

if [ $a -lt $b ] средства, если значение меньше, чем значение 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.
11
ответ дан 23 November 2019 в 07:23

Это - состав трех вещей:

  • $# переменная оболочки, которая содержит количество позиционных параметров к сценарию или функции.

  • [ не специальный синтаксис, а скорее название программы — это - псевдоним для 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 как первый операнд =.

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

2
ответ дан 23 November 2019 в 07:23

Другие вопросы по тегам:

Похожие вопросы: