Почему "никогда не используйте оператор -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 ]; }
(
и)
операторы , что команды группы? Если они устарели, каковы их замены? (2) Долженtest "$1" -a "$2"
быть замененtest "$1" && test "$2"
или((test "$1" && test "$2"))
? Разве нам не нужно((..))
?()
и{}
в качестве замены. (2) первый;(())
используется для арифметического расширения, здесь вы хотите проверить состояние завершения цепочки тестов, поэтому сгруппируйте тесты в подоболочку()
или в текущую оболочку{}
.(
and)
- это когда вы используете-a
или-o
. Поскольку последние являются устаревшими, первые, очевидно, больше не нужны.