Что такое / usr / bin / [и как мне его использовать?

26

Я смотрел на Coreutils и нашел это в качестве одного из файлов , включенных в часть Coreutils: /usr/bin/[. Что это такое [и что оно делает?

Это исполняемый файл. Я просто не знаю, что он делает или как его использовать.

$ file / usr / bin / [
/ usr / bin / [: исполняемый 32-разрядный LSB ELF, Intel 80386, версия 1 (SYSV), динамически связанный (использует общие библиотеки), для GNU / Linux 2.6.15, раздетый

Когда я пытаюсь запустить его, я думаю, что по умолчанию используется bash, встроенный в расширение строки. Вместо того, чтобы фактически запустить файл.

$ "/ usr / bin / ["
/ usr / bin / [: отсутствующий ] ']' $ /usr/bin/\[
/usr/bin/[: missing

nelaaro
источник
2
man [работает на OS X.
Даниэль Бек

Ответы:

33

Это эквивалент команды test. (См info test.) Обычно вы используете его в скриптах в условных выражениях, таких как:

if [ -n "$1" ]; then
    echo $1
fi

Закрывающая скобка обязательна для включения условного выражения. (Что ж, похоже, требуется просто выглядеть в коде лучше. Кто-нибудь знает какие-либо другие практические причины для этого?)

Rajish
источник
3
Обратите внимание, что [это как встроенная оболочка, так и внешняя программа с одинаковым (или похожим) использованием. В bash, когда вы запускаете [или testвызываете встроенный.
Грэвити
Это необходимо, потому что если бы он был необязательным, синтаксис был бы неоднозначным в определенных ситуациях.
Random832
20

Это эквивалентно testкоманде.

Вместо того

if /usr/bin/test -z "$VAR"
then
    echo VAR not set
fi

Вы можете использовать:

if /usr/bin/[ -z "$VAR" ]
then
    echo VAR not set
fi

Может использоваться и в циклах:

i=0
while [ $i -lt 10 ]
do
   echo $i
   ((i++))
done

Вы также можете использовать их в одной строке, как это:

[ -z "$VAR" ] && echo VAR not set && exit

[ -f foo.txt ] && cat foo.txt
кендырь
источник
2
хорошие примеры того, как его использовать. "if / usr / bin / ["
nelaaro