В чем разница между if ! [[ foo ]] и если [[ ! foo ]] в Баше?

Итак, снижение размера MTU решило все мои проблемы с вводом-выводом через SSHFS. Как указал @roaima, проблемы, вероятно, были вызваны тем, что брандмауэр университетского сервера слишком активно блокировал пакеты ICMP.

Спасибо @roaima за помощь в решении этой проблемы. И спасибо @derobert за предложение снизить MTU.

1
18.11.2020, 14:38
3 ответа
if ! [[ CONDITION ]]; then

Первый !взят из синтаксиса конвейера:

   A pipeline is a sequence of one or more commands separated by one of the control
   operators | or |&.  The format for a pipeline is:

          [time [-p]] [ ! ] command [ [|⎪|&] command2... ]

   If the reserved word ! precedes a pipeline, the exit status of that pipeline is 
   the logical negation of the exit status as described above.

Ваш второй пример:

if [[ ! CONDITION ]]; then

является выражением:

  [[ expression ]]
  Execute conditional command.

  ! EXPRESSION              True if EXPRESSION is false; else false
1
18.03.2021, 22:48

для одного условия они оба одинаковы:

$ if [[ ! 1 = 1 ]]; then echo true; else echo false; fi
false
$ if ! [[ 1 = 1 ]]; then echo true; else echo false; fi
false

разница возникает при тестировании нескольких условий:

$ if  [[ ! 1 = 2 || 2 = 2 ]]; then echo true; else echo false; fi
true
$ if  ! [[ 1 = 2 || 2 = 2 ]]; then echo true; else echo false; fi
false

поэтому внешнее отрицание имеет больший приоритет над результатом.

Конечно, вы можете применить внутреннее отрицание ко всему условию, поэтому в этом случае вы предпочтете вместо этого использовать внешнее отрицание:

$ if  [[ ! ( 1 = 2 || 2 = 2 ) ]]; then echo true; else echo false; fi
false
5
18.03.2021, 22:48

В первом отрицание осуществляется с помощью if. Это 2-й делается [[. В простом случае это не имеет значения.

Однако иногда необходимы оба, например.

  • if [[ ! a && b ]][[нужна эта способность.
  • if ! lsтеперь это нужно if.
0
18.03.2021, 22:48

Теги

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