test
- это просто команда, поэтому ее выражение анализируется так же, как аргументы любой другой команды - это означает, что скобки, каналы и т. д. должны быть экранированы или заключены в кавычки для работы (и во избежание проблем с этим test
использует -o
вместо ||
). Если вы на самом деле используете bash, у него есть тестовое выражение [[ ]]
которое позволяет избежать этих странностей.
Кроме того, логика вашего выражения отключена. Вы сообщаете об ошибке, если текущий пользователь не mpurcell или не root; так как текущий пользователь не может быть и тем и другим, он всегда выдаст ошибку. Я уверен, что вы хотите и там.
Наконец, так как у вас есть echo ...; exit 1
часть 1 в скобках, она будет выполнена в подоболочке, и, следовательно, команда exit
завершит подоболочку, а не сценарий. Чтобы избежать этого, используйте { ... }
вместо скобок.
Вот версия Bash:
[[ $(whoami) != 'mpurcell' && $(whoami) != 'root' ]] && { echo "Cannot start script as non-ccast user..."; exit 1; }
А вот версия, которая должна работать в универсальной оболочке POSIX:
test "$(whoami)" != 'mpurcell' -a "$(whoami)" \!= 'root' && { echo "Cannot start script as non-ccast user..."; exit 1; }