LINUX.ORG.RU

Зачем нужны круглые скобки ( EXPRESSION ) в утилите test?

 , , ,


0

1

В документации на утилиту test написано:

SYNOPSIS
       test EXPRESSION
       test
       [ EXPRESSION ]
       [ ]
       [ OPTION

DESCRIPTION
       Exit with the status determined by EXPRESSION.

       --help display this help and exit

       --version
              output version information and exit

       An  omitted  EXPRESSION  defaults  to false.  Otherwise, EXPRESSION is true or false 
       and sets exit status.  It is one of:

       ( EXPRESSION )
              EXPRESSION is true

И непонятно, нужно ли выражение обязательно заключать в круглые скобки. Вроде работает и без них. Но тогда зачем нужны круглые скобки?

А если будут составные условия (-o, -a) то тогда нужно писать каждое выражение в круглых скобках или нет?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 2)

непонятно, нужно ли выражение обязательно заключать в круглые скобки.

Нет, конечно, никто тебя не обязывает.

Вроде работает и без них. Но тогда зачем нужны круглые скобки?

Для группировки операций, ну. Как в школьной алгебре, там тоже без них работает, пока приоритет операций совпадает с твоей задумкой.

А если будут составные условия (-o, -a) то тогда нужно писать каждое выражение в круглых скобках или нет?

Нет, просто учитывай, что

  • у -a приоритет выше
  • -a и -o, ЕМНИП, непортабельны, а судя по тому, что ты используешь test вместо [[, тебя это волнует.
t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от t184256

-a и -o, ЕМНИП, непортабельны, а судя по тому, что ты используешь test вместо [[, тебя это волнует.

Меня волнует то, что в man использование && и || только вскольз в примечании написано:

NOTE: Binary -a and -o are inherently ambiguous.
Use 'test EXPR1 && test EXPR2' or 'test EXPR1 || test EXPR2' instead.

А в info почему-то вообще написано что нужно пользоваться примитивами bash:
Note it’s preferred to use shell logical primitives rather than these
logical connectives internal to ‘test’, because an expression may become
ambiguous depending on the expansion of its parameters.

   For example, this becomes ambiguous when ‘$1’ is set to ‘'!'’ and
‘$2’ to the empty string ‘''’:

     test "$1" -a "$2"

   and should be written as:

     test "$1" && test "$2"

- здесь test с -a заменено на два вызова test.

То есть, вообще нигде однозначно не написано что в test есть поддержка && и ||.

Xintrea ★★★★★
() автор топика

На случай если вдруг кто-то не знает (а вдруг), то [ expression ] и [[ expression ]] немного отличаются. Хотя и то и то про проверку условий. И лучше использовать именно двойные скобки [[ expression ]], если интерпретатор позволяет.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

На случай если вдруг кто-то не знает (а вдруг), то [ expression ] и [[ expression ]] немного отличаются. Хотя и то и то про проверку условий. И лучше использовать именно двойные скобки [[ expression ]], если интерпретатор позволяет.

Про синтаксис условий в Bash вот так вот двумя предложениями не говорят.

Я себе сделал вот такую портянку (с учетом данного обсуждения):

Синтаксис условий в BASH скриптах - главные особенности

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Я себе сделал вот такую портянку (с учетом данного обсуждения): Синтаксис условий в BASH скриптах - главные особенности

Какой безумец придумал завершать блок условия оператором fi - это тема для отдельного исторического исследования. fi, как многим понятно, это if, только наоборот. То же самое было сделано для управляющей конструкции case … esac. Логично было бы и другие конструкции завершать их написанием задом-наперед, например цикл for завершать rof, цикл while завершать elihw. Хорошо, что с таким решением решили вовремя завязать и, как минимум, не продолжили эту странную традицию. А fi и case остались как анахронизм, свидетельствующий о том, что авторы Bash были большими оригиналами.

if fi и тому подобное обычное дело в работах по теоретическому программмированию.

Psilocybe ★★★★
()
Ответ на: комментарий от Psilocybe

if fi и тому подобное обычное дело в работах по теоретическому программмированию.

Ага, поэтому эту дичь надо было тащить в реальный язык.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Psilocybe

Какой безумец придумал завершать блок условия оператором fi

Это он ещё с m4 не сталкивался (формат конфигов sendmail), где в конце каждой строки нужно писать dnl - это аналог точки с запятой в некоторых современный языках. Вот что курил создатель m4 я сам хотел бы узнать.

https://www.revsys.com/writings/quicktips/sendmail-mc.html

Kroz ★★★★★
()