никогда не используйте оператор `-a` или` -o` с `[`

11

Стефан Шазелас писал:

несколько правил, таких как

  • всегда указывать переменные
  • никогда не используйте оператор -aor -o(используйте несколько [команд &&и ||операторы и shell)

Сделать [надежным с POSIX снарядами.

Почему "никогда не используйте оператор -aили -o"?

Как я могу сделать "использовать несколько [команд &&и ||операторы и операторы оболочки)"?

Тим
источник

Ответы:

13

Почему "никогда не используйте оператор -aили -o"?

Потому что они могут быть двусмысленными и, следовательно, они не POSIX-совместимые :

Расширения XSI, определяющие двоичные основные цвета -a и -o и операторы '(' и ')', были помечены как устаревшие. (Многие выражения, использующие их, неоднозначно определяются грамматикой в ​​зависимости от оцениваемых конкретных выражений.) Сценарии, использующие эти выражения, должны быть преобразованы в формы, приведенные ниже. Несмотря на то, что многие реализации будут продолжать поддерживать эти устаревшие формы, сценарии должны быть предельно осторожны при работе с вводимыми пользователем данными, которые можно спутать с этими и другими основными цветами и операторами. Если разработчик приложения не знает все случаи, которые производят ввод в сценарий, такие вызовы, как:

test "$1" -a "$2"

должно быть написано как:

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

Как я могу сделать "использовать несколько [команд &&и ||операторы и операторы оболочки)"?

Выполняя несколько тестов и объединяя их в цепочку с помощью указанных операторов; например:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

может быть переписан как эквивалент:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

или лучше:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }
кос
источник
Благодарю. (1) «операторы '(' и ')' были помечены как устаревшие". Существуют (и )операторы , что команды группы? Если они устарели, каковы их замены? (2) Должен test "$1" -a "$2"быть заменен test "$1" && test "$2"или ((test "$1" && test "$2"))? Разве нам не нужно ((..))?
Тим
@Tim Смотрите обновление. (1) Да - вы можете использовать ()и {}в качестве замены. (2) первый; (())используется для арифметического расширения, здесь вы хотите проверить состояние завершения цепочки тестов, поэтому сгруппируйте тесты в подоболочку ()или в текущую оболочку {}.
Кос
Благодарю. Я думаю, что мои вопросы могут выходить за рамки этого поста. Поэтому я публикую их в новом сообщении.
Тим
1
@Tim Единственная причина использовать операторы (and )- это когда вы используете -aили -o. Поскольку последние являются устаревшими, первые, очевидно, больше не нужны.
Бармар