Синтаксис bash не похож на C, даже если часть его вдохновлена C. Вы не можете просто попытаться написать код на C и ожидать, что он будет работать.
Основная суть оболочки - это выполнение команд. Команда open-bracket [
- это команда, которая выполняет один тест¹. Вы даже можете записать ее как test
(без последней закрывающей скобки). Операторы ||
и &&
- это операторы оболочки, они объединяют команды, а не тесты.
Поэтому, когда вы пишете
[ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eq "0" ]
это разбирается как
[ [ "$A" -eq "0" ] ||
[ "$B" -ne "0" ] ] &&
[ "$C" -eq "0" ]
что то же самое, что и
test [ "$A" -eq "0" ||
test "$B" -ne "0" ] &&
test "$C" -eq "0"
Заметили несбалансированные скобки? Да, это нехорошо. Ваша попытка с круглыми скобками имеет ту же проблему: ложные скобки.
Синтаксис для объединения команд в группы - это скобки. Способ разбора скобок требует, чтобы перед ними была полная команда, поэтому вам придется завершить команду внутри скобок новой строкой или точкой с запятой.
if { [ "$A" -eq "0" ] || [ "$B" -ne "0" ]; } && [ "$C" -eq "0" ]; then …
Существует альтернативный способ, который заключается в использовании двойных скобок. В отличие от одинарных скобок, двойные скобки - это специальный синтаксис оболочки. Они разграничивают условные выражения. Внутри двойных скобок можно использовать круглые скобки и такие операторы, как &&
и ||
. Поскольку двойные скобки - это синтаксис оболочки, оболочка знает, что когда эти операторы находятся внутри скобок, они являются частью синтаксиса условного выражения, а не частью синтаксиса обычной команды оболочки.
if [[ ($A -eq 0 || $B -ne 0) && $C -eq 0 ]]; then …
Если все ваши тесты являются числовыми, есть еще один способ - разграничение арифметических выражений. Арифметические выражения выполняют целочисленные вычисления с очень похожим на C синтаксисом.
if (((A == 0 || B != 0) && C == 0)); then …
Вы можете найти мой учебник по скобкам в bash полезным.
[
можно использовать в обычном sh. [[
и ((
специфичны для bash (а также ksh и zsh).
¹ Он также может объединять несколько тестов с помощью булевых операторов, но это громоздко в использовании и имеет тонкие подводные камни, поэтому я не буду это объяснять.
Каждый из вас может хранить свои файлы конфигурации в разных каталогах.
/home/user1/.vimrc
/home/user2/.vimrc
Затем создайте псевдоним в root ~ / .bashrc, чтобы использовать разные конфигурации.
alias vi='vim -u /home/user1/.vimrc'
alias vim='vim -u /home/user2/.vimrc'
Если у вас возникли проблемы с загрузкой плагинов, убедитесь, что ваши ссылки в ваших файлах .vimrc не используют $ HOME или ~ / для ссылки на какие-либо файлы, потому что когда root пытается их прочитать, он будет искать в / root / путь / к / файлу
Я знаю, что это не прямой ответ на ваш вопрос, но вы когда-нибудь задумывались о создании собственного пользователя root? Вы можете создать пользователя с идентификатором пользователя 0. Он действует как учетная запись root, но это ваш собственный пользователь . Вы можете иметь свои настройки vim, другую оболочку и т. Д.
useradd -u 0 --non-unique yourroot
Конечно, вы должны добавить другие переключатели для создания такой учетной записи.