В основном, argv включает имя программы, чтобы вы могли писать сообщения об ошибках типа prgm: file: No such file or directory
, что можно реализовать примерно так:
fprintf( stderr, "%s: %s: No such file or directory\n", argv[0], argv[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 ]; }