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

В основном, argv включает имя программы, чтобы вы могли писать сообщения об ошибках типа prgm: file: No such file or directory, что можно реализовать примерно так:

    fprintf( stderr, "%s: %s: No such file or directory\n", argv[0], argv[1] );
11
13.04.2017, 15:37
1 ответ

Почему "никогда не используйте оператор -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 ]; }
13
27.01.2020, 19:58

Теги

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