Яке призначення виконуваної квадратної дужки


Відповіді:


33

У більшості випадків [це вбудована оболонка і еквівалентна test. Однак, як-от test, він також існує як окремий виконуваний файл: це /bin/[ви бачили. Ви можете перевірити це за допомогою type -a [(у системі Arch Linux bash);

$ type -a [
[ is a shell builtin
[ is /bin/[

Отже, у моїй системі у мене два [: вбудована оболонка і виконуваний в /bin. Виконаний файл задокументовано man test:

TEST(1)                          User Commands                         TEST(1)

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION

DESCRIPTION
       Exit with the status determined by EXPRESSION.

[ ... ]

Як ви бачите в уривку довідної сторінки, цитованої вище, testі [є рівнозначними. Команди /bin/[та /bin/testкоманди визначені POSIX , тому ви знайдете їх, незважаючи на те, що багато оболонок також надають їх як вбудовані. Їх наявність забезпечує такі конструкції, як:

[ "$var" -gt 10 ]  && echo yes

буде працювати, навіть якщо оболонка, що працює над ними, не має [вбудованого. Наприклад, у tcsh:

> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ]  && echo yes
yes

5
@AlexandruIrimiea, що ти маєш на увазі? Оболонка, яка не має [вбудованого, - це просто оболонка, автори якої вирішили не додавати її. tcsh не має на [вбудовану команду, наприклад.
terdon

7
@AlexandruIrimiea вони не є "звичайними" оболонками. Просто bashце лише одна з багатьох програм (оболонок), розроблених для виконання подібних робіт. Bash - одна з найпопулярніших, але багатьох системних суден з різними оболонками за замовчуванням. Деякі з найбільш відомих з них є sh, bash, zsh, dash, ksh, tcsh, cshі fish. Ви можете ознайомитись з тими, які доступні у вашій системі, cat /etc/shellsта частковий список тут .
terdon

1
@ JörgWMittag насправді? Я знав , що в Ubuntu shє , dashале я думав , що рятувальна система використовує /bin/shНЕ BusyBox. Ти впевнений?
terdon

2
Однак у initramfs дійсно є зайнята скринька, про що свідчить це запитання
Сергій Колодяжний

1
@AlexandruIrimiea, про те, які команди потрібно вбудувати та які команди можуть бути, а чи не можуть бути вбудовані, дивіться цей пост .
Wildcard

12

Це використовується для тестування стану в скриптах оболонки. Ще одна назва цієї програми test:

if [ 1 -lt 2 ]; then ...

Це схоже на граматику оболонки, але це не так. Зазвичай [це вбудована оболонка, але, ймовірно, резервна вона існує як зовнішня команда.

Дивіться блок "УМОВНІ ВИРАЗИ" в man bash.


1
Дивіться також: unix.stackexchange.com/questions/224616/…
dr01

9

[така ж команда, як і test. У деяких * nix системах одна - лише посилання на іншу. Наприклад, якщо ви запускаєте:

strings /usr/bin/test 
strings /usr/bin/[

ви побачите той самий вихід.

Більшість sh-оболонок / posix-оболонок включають вбудовані [та testкоманди. Те саме стосується і для echo. У /bin/echoбільшості оболонок є як команда, так і вбудована. Саме тому іноді ви відчуваєте, що, наприклад, echoне працює однаково в різних системах.

testабо [повернути лише вихідний код 0або 1. Якщо тест був успішним, вихідний код дорівнює 0.

# you can use [ command but last argument must be ] 
# = inside joke for programmers 
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write 
#    [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2  && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no

Ви також можете використовувати [з if:

if [ -f file.txt ] ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi
# is the same as
if test -f file.txt  ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi

Але ви можете використовувати ifз кожною командою ifдля тестування вихідного коду. Наприклад:

cp x y 2>/dev/null && echo cp x y OK ||  echo cp x y not OK

Або, використовуючи if:

if cp x y 2>/dev/null ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

Ви можете отримати той же результат, використовуючи лише testкоманду для тестування коду виходу, який зберігається у змінній stat:

cp x y 2>/dev/null 
stat=$?
if test "$stat" = 0 ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

Можна також використовувати [[ ]]і (( ))для тестування, але вони не є такими ж, як [і test, незважаючи на майже однаковий синтаксис:

Нарешті, щоб дізнатися, що таке команда, ви можете скористатися:

type -a command

Для порівняння файлів слід скоріше використовувати cmp /usr/bin/[ /usr/bin/testабо, можливо, хеші, sha256sum /usr/bin/[ /usr/bin/testале ні strings. У моїй системі (openSUSE Tumbleweed) BTW вони не однакові (чому б то не було).
Hauke ​​Laging

Я не мав на увазі порівняння байтів. У деяких * nix вони однакові також у рівні байтів = пов'язані. Тест Posix
kshji
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.