Я новичок в Unix/Linux. Я пытаюсь понять код разработчика, который был до меня. Кто-нибудь может мне сказать, что означает эта строка if [ $# -lt 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.
Это - состав трех вещей:
$#
переменная оболочки, которая содержит количество позиционных параметров к сценарию или функции.
[
не специальный синтаксис, а скорее название программы — это - псевдоним для 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
как первый операнд =
.
[[
…]]
ключевое слово оболочки (не встроенное), со специальными правилами парсинга обратиться к ограничению выше, и который может обеспечить дополнительные функции.